归并排序
归并排序利用了两个有序序列合并的过程;
两个有序序列合并的过程通常为:设置两个指针分别指向两个序列的头部,依次扫描比较两个序列数值的大小,并不断取出较小的值;在比较的过程中,如果其中一个序列为空,则将另一个序列剩余的值全部取出。
那么归并排序的基本思想是将无序序列分成两个部分,而这两个部分各自为有序的,再将其按照上诉步骤合并即可。
那在什么情况下才两个部分才能是有序的,当每个部分都只有一个元素时即各自有序;
所以使用递归的方式,序列分成分散的组,再进行合并实现归并排序。
以下图为例,详细描述归并排序过程:
(图片来自http://blog.youkuaiyun.com/jianyuerensheng/article/details/51262984 ,侵权删)
代码实现如下:
public class MergeSort {
public static void main(String[] args) {
int[] a = {4,2,3,1,7,6};
sort(a,0,a.length-1);
for(int i = 0;i<a.length;i++)
System.out.println(a[i]);
}
public static void merge(int a[], int left, int right){
int[] temp = new int[right-left+1];//设置临时数组变量,存放和合并结果
int mid = (left + right)/2;
int l = left; //第一个序列的头部
int r = mid + 1; //第二序列的头部
int i = 0;
//合并两个有序序列
while(l<=mid && r<=right){
if(a[l]<a[r])
temp[i++] = a[l++];
else
temp[i++] = a[r++];
}
//第二个序列为空了
while(l<=mid){
temp[i++] = a[l++];
}
//第一个序列为空了
while(r <= right){
temp[i++] = a[r++];
}
//将合并结果返回到a
for(int j = 0;j<temp.length;j++){
a[left+j] = temp[j];
}
}
public static void sort(int a[],int left,int right){
int mid = (left+right)/2;
if(left<right){
//首先对两个部分排序
sort(a,left,mid);
sort(a,mid+1,right);
//然后合并两个有序部分
merge(a,left,right);
}
}
}