#include<stdio.h>
#include<stdlib.h>
void merge(int *A,int p,int q,int r);//合并
void merge_sort(int *A,int p,int r);//归并排序,递归
int get_length(int *A);//获取数组长度
int main()
{
int n=0;
int A[100]={1,45,9,90,46,456,3,78,234,23,76,345,863,47};
merge_sort(A,0,get_length(A)-1);
while(A[n]!='\0')
{printf("%6d",A[n]);
n++;
}
return 1;
}
void merge_sort(int *A,int p,int r)
{
int q;
if(p<r)
{
q=(p+r)/2;
merge_sort(A,p,q);
merge_sort(A,q+1,r);
merge(A,p,q,r);
}
}
void merge(int *A,int p,int q,int r)
{
int i=0,j=0,k;
int num1=q-p+1; //A[p..q]
int num2=r-q; //A[q+1..r]
int *L1=(int *)malloc(sizeof(int)*(num1+1)); //最后一个元素存放一个足够大的值,做哨兵元素,简化操作
int *L2=(int *)malloc(sizeof(int)*(num2+1));
for(k=0;k<num1;k++) //将A[]中的元素分配到申请的空间中
L1[k]=A[p+k];
L1[k]=1000000;
for(k=0;k<num2;k++)
L2[k]=A[q+1+k];
L2[k]=1000000;
for(k=0;k<r-p+1;k++)
{
if(L1[i]<=L2[j])
{A[p+k]=L1[i];
i++;
}
else
{
A[p+k]=L2[j];
j++;
}
}
free(L1);
free(L2);
}
int get_length(int *A)
{
int len=0;
while(A[len]!='\0')
len++;
return len;
}
归并排序C语言代码
最新推荐文章于 2024-01-25 10:57:15 发布