归并排序

来源:互联网 发布:美分知乎 编辑:程序博客网 时间:2024/06/03 20:07

基本思想:

归并排序用到了分治思想。归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。


合并过程:

设r[i…n]由两个有序子表r[i…m]和r[m+1…n]组成,两个子表长度分别为n-i +1、n-m

  1. j=m+1;k=i;i=i; //置两个子表的起始下标及辅助数组的起始下标
  2. 若i>m 或j>n,转⑷ //其中一个子表已合并完,比较选取结束
  3. //选取r[i]和r[j]较小的存入辅助数组rf
    如果r[i]<r[j],rf[k]=r[i]; i++; k++; 转⑵
    否则,rf[k]=r[j]; j++; k++; 转⑵
  4. //将尚未处理完的子表中元素存入rf
    如果i<=m,将r[i…m]存入rf[k…n] //前一子表非空
    如果j<=n ,  将r[j…n] 存入rf[k…n] //后一子表非空
  5. 合并结束。

实现如下:

public class mergeSort {public static void main(String[] args) {// TODO Auto-generated method stubmergeSort ms = new mergeSort();int a[]={3,5,2,9,7,1,4};int n=a.length;int[] temp = new int[n];ms.mergeSort(a, temp, 0, n-1);for(int i=0;i<n;i++){System.out.println(a[i]);}}public void merge(int a[],int temp[],int leftPos,int rightPos,int rightEnd){int leftEnd = rightPos - 1;int tmpPos = leftPos;int length = rightEnd - leftPos + 1;for(;leftPos<=leftEnd&&rightPos<=rightEnd;++tmpPos){if(a[leftPos]<=a[rightPos]) temp[tmpPos] = a[leftPos++];elsetemp[tmpPos] = a[rightPos++];}//将剩下的左数组中的数据存到temp中while(leftPos<=leftEnd) temp[tmpPos++] = a[leftPos++]; //将剩下的右数组中的数据存到temp中while(rightPos<=rightEnd) temp[tmpPos++] = a[rightPos++];//把temp数组中数据再复制到a数组中for(int i=0;i<length;i++,rightEnd--)a[rightEnd] = temp[rightEnd];}public void mergeSort(int a[],int temp[],int left,int right){if(left < right){int center = (left + right)/2;mergeSort(a,temp,left,center);mergeSort(a,temp,center+1,right);merge(a,temp,left,center+1,right);}}}


分析:归并排序是稳定的,最坏时间复杂度和平均时间复杂度是o(nlogn)


参考资料:http://blog.csdn.net/hguisu/article/details/7776068

0 0
原创粉丝点击