分享,合并(分治法)排序,mergeSort

xladykiller xladykiller 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
合并排序的关键步骤在于合并步骤中的合并两个已排序子序列。为做排序,引入一个辅助过程merger(A,p,q,r),其中A是个数组,pqr是下标,满足p<= q < r。该过程假设A[p..q]和A[q+1..r]都已排序,并将它们合并成一个已经排好序的子数组代替当前子数组A[p..r]
#include<stdio.h>
#include<stdlib.h>
void merger(int * A,int p,int q,int r);
void mergerSort(int * A,int p,int r);
int main()
{
int A[10] = {0};
int i = 0;

for(i = 0;i < 10;i++)
{
scanf("%d",A + i);
}

printf("输入为:\n");
for(i = 0;i < 10;i++)
{

printf("%d",A[i]);
}
mergerSort(A,0,9);
printf("\n排序后:\n");
for(i = 0;i < 10;i++)
{
printf("%d",A[i]);
}
printf("\n");
return 0;
}
void merger(int * A,int p,int q,int r)
{
int n1 = q - p + 1;
int n2 = r - q ;
int i = 0,k = 0,j = 0;
int * L = (int*)malloc(sizeof(int) * n1 + 1);
int * R = (int *)malloc(sizeof(int) * n2 + 1);
for(i = 0;i < n1;i++)
{
L[i] = A[p + i];
}
L[i] = 99999;
for(i = 0;i < n2;i++)
{
R[i] = A[q + i + 1];
}
R[i] = 99999;
i = j = 0;

for(k = p;k <= r;k++)
{
if(L[i] < R[j])
{
A[k] = L[i];
i++;
}
else
{
A[k] = R[j];
j++;
}
}
free(R);
free(L);
}
void mergerSort(int * A,int p,int r)
{
int mid = 0;
if(p < r)
{
mid = (r + p) / 2;
mergerSort(A,p,mid);
mergerSort(A,mid + 1,r);
merger(A,p,mid,r);
}
}

运行结果:
chu@szcdebian:~/code/merge-sort$ gcc -o merge merge-sort.c
chu@szcdebian:~/code/merge-sort$ ./merge
9 0 6 8 7 3 4 2 5 1
输入为:
9068734251
排序后:
0123456789
chu@szcdebian:~/code/merge-sort$
...全文

相关推荐

评论 22
收藏 已收藏
分享
返回顶部
xladykiller
C语言 70,040 成员 243,237 内容