二路归并排序
二路归并排序的思想:一次排序过程,将已经各自有序的两个段的数据合并一个段,并且合并后依旧有序。第一次我们认为单个数据是有序的,一个数据就是一个段,一次排序后,两个数据就是一个有序数据段,这样下一次每个有序数据段就是两个数据。最后将其合并成一个完成有序段,则整个数据就已经排序好了。
#include <stdio.h>
#include <assert.h>
#include <malloc.h>
void Meger(int *arr,int len,int width,int *brr)
{
int low1=0;
int high1=low1+width-1;//high1为第一个段的结束位置下标
int low2=high1+1;
int high2=low2+width>len?len-1:low2+width-1;
int index=0;
//处理有两个归并段
while(low2<len)
{
//两个归并段都有未归并数据
while(low1<=high1&&low2<=high2)
{
if(arr[low1]<arr[low2]) brr[index++]=arr[low1++];
else brr[index++]=arr[low2++];
}
//只剩下一个归并段数据
while(low1<=high1) brr[index++]=arr[low1++];
while(low2<=high2) brr[index++]=arr[low2++];
low1=high2+1;
high1=low1+width-1;
low2=high1+1;
high2=low2+width>len?len-1:low2+width-1;
}
//处理只剩下一个归并段的情况
while(low1<len) brr[index++]=arr[low1++];
//将brr中的数据全部复制到arr中
for(int i=0;i<len;i++) arr[i]=brr[i];
}
void MegerSort(int *arr,int len)
{
int *brr=(int *)malloc(sizeof(int)* len);
assert(brr!=NULL);
//i就是每个段当前的数据个数
for(int i=1;i<len;i*=2)
{
Meger(arr,len,i,brr);
}
free(brr);
}