分享,合并(分治法)排序,mergeSort
合并排序的关键步骤在于合并步骤中的合并两个已排序子序列。为做排序,引入一个辅助过程merger(A,p,q,r),其中A是个数组,pqr是下标,满足p<= q < r。该过程假设A[p..q]和A[q+1..r]都已排序,并将它们合并成一个已经排好序的子数组代替当前子数组A[p..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$
#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$
...全文
相关推荐
java二路归并排序示例分享
"java二路归并排序示例分享"java二路归并排序是一种高效的排序算法,通过分治法将数组分成小的数组分别排序,然后将排序好的数组合并。
分治法合并排序算法实现merge
在本案例中,我们将讨论如何利用分治法实现合并排序(Merge Sort),这是一种效率较高的排序算法,其时间复杂度为O(n log n)。
C++实现归并排序(MergeSort)
C++实现归并排序(MergeSort)在这里,我们将详细介绍C++实现归并排序(MergeSort)的知识点。
MergeSort:排序算法-合并排序
合并排序(Merge Sort)是一种基于分治法的高效排序算法,它的主要思想是将大问题分解为小问题来解决。
MergeSort(合并排序)
### 合并排序(MergeSort)知识点解析#### 一、合并排序算法介绍合并排序是一种采用分治法策略的高效排序算法。


