7.归并排序**
7.1原理
设原数据为:
两个数字一组之间归并:(二路归并),谁小谁下来(需要新数组放排序后数据)
再4个数字一组,比较l1与l2数字谁小谁下来且下标后移,直到l1>h1或,l2>h2;剩余没下来的数字再下来
再8个数字,16个数字…一组,直到整体有序,因此快
7.2代码
//每次归并
void Merge (int *arr,int len,int gap)//时间复杂度O(n),空间复杂度O(n)需要额外数组brr
{
int low1=0;
int high1=gap-1;
int low2=high1+1;
int high2=low2+gap<len?low2+gap-1:len-1;//防止越
//界,最后一组可能数字不够
int *brr=(int *)malloc(len*sizeof(int));
int i=0;//brr下标
//有两个归并段
While(low2<len)
{
//两个归并段都有数据
while(low1<=high1&&low2<=high2)
{
if(arr[low1]<=arr[low2])
{
brr[i++]=arr[low1++];
}
else
{
brr[i++]=arr[low2++];
}
}
//谁小谁下来后还有剩余数据
while(low1<=high1)
{
brr[i++]=arr[low1++];
}
while(low2<=high2)
{
brr[i++]=arr[low2++];
}
//进入下两个归并段
low1 = high2+1;
high1=low1+gap-1;
low2=high1+1;
high2=low2+gap<len?low2+gap-1:len-1;
}
//打单的段
While(len1<len)
{
brr[i++]=arr[low1++];
}
//brr放入arr中,并将动态内存free
for( i=0;i<len;i++)
{
arr[i]=brr[i];
}
free(brr);
}
//归并排序
void MergeSort(int *arr,int len)
{
for(int i=0;i<len;i*=2)//每次组内数字个数
{
Merge(arr,len,i);
}
}
7.3评价
①时间复杂度O(nlogn),空间复杂度O(n)
②稳定***,不稳定指跳跃交换数据,而本排序是创建额外数组空间,放到新数组,没有在arr中数据交换.因此归并排序快而稳定但空间复杂度大