归并排序的基本思路就是将数组分成二组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),当数据量巨大时,百万甚至千万,上亿的数组时,性能就比如快排和堆排序了。