归并排序

来源:互联网 发布:王者荣耀优化安卓7.0 编辑:程序博客网 时间:2024/06/08 06:55

归并排序的基本思路就是将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。如何让这二组组内数据有序了?

可以将A,B组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了.

这样通过先递归的分解数列,再合并数列就完成了归并排序。

void MergeArray(int* array,int first,intmid,int last,int*tempArray){       inti=first,j=mid+1;       intm=mid,n=last;       intk=0;       while(i<=m&&j<=n)       {              if(array[i]<=array[j])                     tempArray[k++]=array[i++];              else                     tempArray[k++]=array[j++];       }       while(i<=m)              tempArray[k++]=array[i++];       while(j<=n)              tempArray[k++]=array[j++];       for(inti=0;i<k;i++)              array[first+i]=tempArray[i];}void mergesort(int* array,int first,intlast,int* tempArray){       if(first<last)       {              intmid=(first+last)/2;              mergesort(array,first,mid,tempArray);              mergesort(array,mid+1,last,tempArray);              MergeArray(array,first,mid,last,tempArray);       }}void MergeSort(int* array,int n){       if(array==NULL||n<1)              return;       int*tempArray=new int[n];       mergesort(array,0,n-1,tempArray);       delete[]tempArray;}


假设数列长度为N,将数列分成小数列一共需要logN,每步都是一个合并有序数列,时间复杂度为O(N),故时间复杂度O(NlogN).

归并排序的效率很高,在数组不是特别巨大的时候(10万个元素以内的排序),归并排序甚至比快速排序的效率还要高。但是归并排序需要用到一个辅助数组,空间复杂度也是O(n),当数据量巨大时,百万甚至千万,上亿的数组时,性能就比如快排和堆排序了。

0 0
原创粉丝点击