首先,可以先从网上了解一下calloc()函数的用法,用来创建一个内存可变的动态数组
本文使用的是哨兵的归并排序
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define MAX 9999
void MERGE(int a[], int p, int q,int r)//归并排序 (子函数)
{
int n1 = q-p + 1;
int n2 = r-q;
int* L = (int*)calloc(n1+1,sizeof(int));
int* R = (int*)calloc(n2+1,sizeof(int));
if (L== NULL||R==NULL)//判断建立动态内存是否成功
{
printf("%s\n", strerror(errno));
exit(-1);
}
int i=0, j=0;
//对新建的数组赋值
for (i = 0; i < n1; i++)
L[i] = a[p + i];
for (j = 0; j < n2; j++)
R[j] = a[q + j + 1];
i = 0, j = 0;//初始化
L[n1] = MAX;//哨兵,判断L是否插入完成
R[n2] = MAX;
for (int k = p; k < r + 1; k++)//插入并排算法
{
if (L[i]<=R[j])
{
a[k] = L[i];
i++;
}
else
{
a[k]=R[j];
j++;
}
}
free(L);//释放动态空间
free(R);
}
void MERGESORT(int a[], int p, int r)
{
if (p < r)//当子数列只有一个元素时,开始从底层回归
{
//递归将a【】数组分支处理
int q = (int)floor(((double)p + r) / 2.0);
MERGESORT(a, p, q);
MERGESORT(a, q + 1, r);
MERGE(a, p, q, r);
}
}
int main()
{
int a[] = { 3,41,52,26,38,57,9,49 };
int ret=sizeof(a) / sizeof(a[0]);
MERGESORT(a, 0, 7);
for (int i = 0; i < 7; i++)
printf("%d ", a[i]);
return 0;
}