#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define LENGTH 13
//时间复杂度:n*logn 空间复杂度: n 稳定性:稳定
//根据width进行一次归并排序
void Meger(int arr[],int len,int width) //width == 1 2 4 8 16
{
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)
{
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)
{
for(int i = 1;i < len;i *= 2)
{
Meger(arr,len,i);
}
}
void ShowData(int arr[],int len)
{
for(int i = 0;i < len;i++)
{
printf("%d “,arr[i]);
}
printf(”\n");
}
int main()
{
srand((unsigned int)time(NULL));
int arr[LENGTH] = { 0 };
for(int i = 0 ;i < LENGTH ;i++)
{
arr[i] = rand() % 100;
}
ShowData(arr,LENGTH);
MegerSort(arr,LENGTH);
ShowData(arr,LENGTH);
}