17. 数据结构进阶十七排序实现之归并排序
2017-09-24 21:22
204 查看
17. 数据结构进阶十七排序实现之归并排序
“人生不是一种享乐 ,
而是一桩十分沉重的工作。-- 列夫 .
托尔斯泰”
我们来看下归并排序。
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
例如,有初始关键字序列:72,18,53,36,48,31,36,其二路归并排序过程如下所示。
n=7 [72] [18] [53] [36] [48] [31] [36]
一趟归并: [18 72][36 53] [31 48] [36]
二趟归并: [18 3653 72] [31 36 48]
三趟归并: [18 3136 36 48 53 72]
最后执行如下图1
#defineElemTypeint
void print(inta[],intn){
for(intj= 0; j<n;
j++){
printf("%d",a[j]);
}
}
//将r[i…m]和r[m
+1 …n]归并到辅助数组rf[i…n]
void Merge(ElemType *r,ElemType
*rf,
inti,
intm,
intn)
{
intj,k;
for(j=m+1,k=i;
i<=m&& j <=n
; ++k){
if(r[j]<
r[i])rf[k]=
r[j++];
elserf[k]=
r[i++];
}
while(i<=
m) rf[k++] =
r[i++];
while(j<=
n) rf[k++] =
r[j++];
// print(rf,n+1);
}
void MergeSort(ElemType *r,
ElemType *rf,
intlenght)
{
intlen = 1;
ElemType*q =
r ;
ElemType*tmp ;
while(len<
lenght) {
int s= len;
len= 2 * s ;
int i= 0;
while(i+len <lenght){
Merge(q,rf, i, i+ s-1, i+ len-1 );
//对等长的两个子表合并
i= i+ len;
}
if(i+ s <
lenght){
Merge(q,rf, i, i+ s -1,
lenght-1);
//对不等长的两个子表合并
}
tmp= q; q =
rf;
rf =tmp;
//交换q,rf,以保证下一趟归并时,仍从q
归并到rf
}
}
int main(){
inta[10] = {3,1,5,7,2,4,9,6,10,8};
intb[10];
printf("\n初始化数组输出\n");
print(a,10);
MergeSort(a,b, 10);
printf("\n最后归并算法后输出\n");
print(a,10);
}
“人生不是一种享乐 ,
而是一桩十分沉重的工作。-- 列夫 .
托尔斯泰”
我们来看下归并排序。
1. 归并排序
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
例如,有初始关键字序列:72,18,53,36,48,31,36,其二路归并排序过程如下所示。
n=7 [72] [18] [53] [36] [48] [31] [36]
一趟归并: [18 72][36 53] [31 48] [36]
二趟归并: [18 3653 72] [31 36 48]
三趟归并: [18 3136 36 48 53 72]
2. 代码实现
代码实现同上面文字描述基本一致。最后执行如下图1
3. 源码
#include"stdio.h"#defineElemTypeint
void print(inta[],intn){
for(intj= 0; j<n;
j++){
printf("%d",a[j]);
}
}
//将r[i…m]和r[m
+1 …n]归并到辅助数组rf[i…n]
void Merge(ElemType *r,ElemType
*rf,
inti,
intm,
intn)
{
intj,k;
for(j=m+1,k=i;
i<=m&& j <=n
; ++k){
if(r[j]<
r[i])rf[k]=
r[j++];
elserf[k]=
r[i++];
}
while(i<=
m) rf[k++] =
r[i++];
while(j<=
n) rf[k++] =
r[j++];
// print(rf,n+1);
}
void MergeSort(ElemType *r,
ElemType *rf,
intlenght)
{
intlen = 1;
ElemType*q =
r ;
ElemType*tmp ;
while(len<
lenght) {
int s= len;
len= 2 * s ;
int i= 0;
while(i+len <lenght){
Merge(q,rf, i, i+ s-1, i+ len-1 );
//对等长的两个子表合并
i= i+ len;
}
if(i+ s <
lenght){
Merge(q,rf, i, i+ s -1,
lenght-1);
//对不等长的两个子表合并
}
tmp= q; q =
rf;
rf =tmp;
//交换q,rf,以保证下一趟归并时,仍从q
归并到rf
}
}
int main(){
inta[10] = {3,1,5,7,2,4,9,6,10,8};
intb[10];
printf("\n初始化数组输出\n");
print(a,10);
MergeSort(a,b, 10);
printf("\n最后归并算法后输出\n");
print(a,10);
}
相关文章推荐
- 16. 数据结构进阶十六排序实现之基数排序
- 数据结构之进阶排序(希尔排序、快速排序、归并排序)
- 【数据结构与算法】【排序】归并排序的代码实现
- 18. 数据结构进阶十八排序实现之快速排序
- 12. 数据结构进阶十二排序实现之直接插入法
- 13. 数据结构进阶十三排序实现之希尔排序法
- 14. 数据结构进阶十四排序实现之简单选择排序
- [C++]数据结构:排序算法Part2----快速排序、归并排序、箱子排序、基数排序
- 数据结构之二分法查找、快速排序思想与实现
- 数据结构:单链表排序--C实现
- 【数据结构与算法】【排序】冒泡排序的代码实现
- 【数据结构之排序8】归并排序
- 【数据结构与算法之排序】归并排序
- 数据结构之---C语言实现选择排序
- 数据结构之物流信息的归并排序(非递归实现)
- Java 数据结构(一)---排序(三) 归并排序
- (模板题)sdut 3402 数据结构实验之排序五:归并求逆序数(归并排序)
- 【数据结构与算法】【排序】希尔排序的代码实现
- 实现Comparable接口对树形结构数据进行排序