个人理解:
归并排序也是运用分区的思想,
1、计算出一个中间点,然后左右分区
2、不停地递归分区,直至无法分区
3、当无法进行分区的时候,根据下标进行比较大小,存入临时数组
4、递归返回阶段,每一次返回都会进行比较,存入数组
归并排序是从下到上,需要一直递归分区直到无法再分区,再进行排序。
图解:
时间复杂度:
最好最坏平均时间复杂度都是0(nlogn)
空间复杂度 O(n)
是否是稳定的排序?
是稳定的
代码
void Merge(int sourceArr[],int tempArr[],int startIndex,int midIndex,int endIndex)
{
int i = startIndex, j =midIndex+1,k = startIndex;
while(i!=midIndex+1 && j!=endIndex+1)
{
if(sourceArr[i]>sourceArr[j])
tempArr[k++] = sourceArr[j++];
else
tempArr[k++] = sourceArr[i++];
}
while(i!=midIndex+1)
tempArr[k++] = sourceArr[i++];
while(j!=endIndex+1)
tempArr[k++] = sourceArr[j++];
for(i=startIndex;i<=endIndex;i++)
sourceArr[i]=tempArr[i];
}
void MergeSort(int sourceArr[],int tempArr[],int startIndex,int endIndex)
{
int midIndex;
if(startIndex<endIndex)
{
midIndex = (startIndex + endIndex )/2;
MergeSort(sourceArr,tempArr,startIndex,midIndex);
MergeSort(sourceArr,tempArr,midIndex+1,endIndex);
Merge(sourceArr, tempArr, startIndex, midIndex, endIndex);
}
}