//author:lilywangcn
public class MergeSort {
//private static int[] array=new int[]{10,30,20,4, 9,-1,6,15,12,8,0,20,4};
private static int[] array=new int[]{10,30,20,4,9,-1,6,15};
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
mergeSort(0,array.length-1);
}
public static void mergeSort(int left, int right){
if(left==right) return;
mergeSort(left,(left+right)/2); //中间的值是(left+right)/2
mergeSort((right+left)/2+1,right);
int[] tmp=new int[right-left+1]; //存储临时归并的结果
int i=left,j=(right+left)/2+1,k=0;//开始归并
while(i<=(right+left)/2&&j<=right){
if(array[i]<=array[j]) tmp[k++]=array[i++];
else tmp[k++]=array[j++];
}
while(i>(right+left)/2&&j<=right){
tmp[k++]=array[j++];
}
while(j>right&&i<=(right+left)/2)
tmp[k++]=array[i++];
for(int m=0;m<tmp.length;m++){
array[left+m]=tmp[m]; //将临时归并结果拷贝回数组
}
print(); //一次归并后的结果
}
private static void print(){
for(int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
System.out.println("");
}
}
算法复杂度:O(n*log2n),算法是稳定的。
//运行结果
10 30 20 4 9 -1 6 15
10 30 4 20 9 -1 6 15
4 10 20 30 9 -1 6 15
4 10 20 30 -1 9 6 15
4 10 20 30 -1 9 6 15
4 10 20 30 -1 6 9 15
-1 4 6 9 10 15 20 30
分享到:
相关推荐
### 分治策略与归并排序 #### 一、分治策略概述 在计算机科学领域,分治(Divide and Conquer)是一种非常重要的算法设计思想。它的基本思想是将一个复杂的问题分解成两个或更多的相同或相似的子问题,直到最后子...
本主题将深入探讨四种常见的排序算法:归并排序、快速排序以及与链表相关的排序方法。 首先,我们来讨论归并排序(Merge Sort)。这是一种基于分治策略的排序算法。归并排序将大问题分解为小问题,然后逐步合并这些...
本篇文章主要探讨了如何在VC++环境中利用多线程技术来实现三种经典的排序算法:冒泡排序、快速排序和归并排序,并对它们的性能进行了比较。 首先,冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,一次...
归并排序
归并排序(Merge Sort)是一种基于分治策略的高效排序算法,它的主要思想是将大问题分解成小问题,然后逐个解决小问题,最后再将解决好的小问题合并成解决大问题的答案。这种算法在计算机科学中有着广泛的应用,尤其...
排序-6-二路归并.cpp
本文将对快速排序、归并排序、堆排序等常见排序算法进行比较和分析,探讨它们的优缺点和适用场景。 首先, let's 看一下这些排序算法的时间复杂度和空间复杂度: | 排序算法 | 平均情况 | 最好情况 | 最坏情况 | ...
Java代码-排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序中部分排序以及算法-贪心法,大家可以将源码下载下来进行学习,附带着注释和解释,有不理解的可以找博主一起探讨,共同...
**三路归并排序**是一种高效的排序算法,尤其在处理含有大量重复元素的序列时表现优秀。该算法基于归并排序的思想,但将其分为三个部分处理,而不是传统的两个部分。在本文中,我们将深入探讨三路归并排序的原理、...
在本资源中,我们主要关注的是使用MATLAB编程语言实现三种经典的排序算法:插入排序、二分归并排序以及归并排序。这些算法是计算机科学基础中的重要组成部分,特别是在算法设计与分析领域。MATLAB是一种强大的数值...
#### 五、归并排序的时间和空间复杂度 - **时间复杂度**:最佳、平均和最坏情况均为 O(n log n)。 - **空间复杂度**:由于使用了额外的数组来存储合并后的结果,所以空间复杂度为 O(n)。 #### 六、应用场景 归并...
本实验旨在通过对两种经典排序算法——快速排序和归并排序的研究与实现,深入理解它们的基本原理、时间复杂度,并通过编程实践比较这两种算法在不同数据规模下的性能表现。 #### 二、快速排序 **1. 基本思想** ...
15-归并排序.cpp
归并排序是一种高效的排序算法,基于分治策略。在C语言中实现归并排序,我们需要理解以下几个关键知识点: 1. **分治法**:归并排序的核心思想是将大问题分解为小问题来解决。首先将数组分为两半,分别对两半进行...
Java常用排序算法-归并排序 归并排序是一种分治思想的排序算法,其基本思想是将待排序的数组分成若干个子序列,每个子序列都是有序的,然后再将子序列合并成一个有序的数组。这种算法的时间复杂度为O(n log n),...
实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...
在本系列的第一部分,我们将深入探讨归并排序的基本原理、实现过程以及其在实际应用中的优势。 归并排序的工作原理可以分为三个主要步骤:分割、归并和合并。首先,将待排序的序列分割成两个相等(或近乎相等)的...
算法的实现----归并排序 数据结构中学过的 编起耍哈哈
实现链表排序(直接插入排序,冒泡排序,简单选择排序,快速排序,归并排序,基数排序)_-