归并排序是建立在归并操作的一种有效的排序算法,将两个顺序序列合并成一个顺序序列的方法,称为二路归并。一种稳定的排序方法。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define LENGTH 13
void ShowData(int arr[])
{
for(int i=0;i<LENGTH;++i)
{
printf("%d ",arr[i]);
}
printf("\n");
}
void Meger(int arr[],int len ,int width)//一次归并过程
{
int *brr=(int *)malloc(sizeof (int)*len); //也可以定义一个新的数组来存放
if(brr==NULL) return ;
int count=0;
int low1=0;
int high1=low1+width-1;
int low2=high1+1;
int high2=low2+width>len?len-1:low2+width-1;
while(low2<len)
{
while(low1<=high1 &&low2<=high2 )
{
if(arr[low1 ]<arr[low2])
{
brr[count++]=arr[low1++];
}
else
{
brr[count++]=arr[low2++];
}
}
//剩余一个归并段有数据
while(low1<=high1 )//前一个归并段有数据 相当于一个if判断
{
brr[count++]=arr[low1++];
}
while(low2<=high2)//后一个归并段有数据
{
brr[count++]=arr[low2++];
}
low1=high2 +1;//下一个归并段的起始位置
high1=low1+width>len?len-1:low1+width-1;
low2=high1+1;
high2=low2+width>len?len-1:low2+width-1;
}
while(low1<len)//只剩一个归并段
{
brr[count++]=arr[low1++];
}
for(int i=0;i<len;++i)
{
arr[i]=brr[i];
}
free(brr);
}
void MegerSort(int arr[],int len)//时间复杂度为n*log n 稳定
{
for(int i=1;i<len;i*=2)//log n
{
Meger(arr,len,i);//n
}
}
int main()
{
srand((unsigned int)time(NULL));//随机因子
int arr[LENGTH]={};
for(int i=0;i<LENGTH;++i)
{
arr[i]=rand()%100; //100以内的随机数
}
ShowData(arr);
MegerSort (arr,LENGTH);
ShowData (arr);
return 0;
}
运行结果如下: