内部排序(四)归并排序
来源:互联网 发布:2015年度十大网络剧 编辑:程序博客网 时间:2024/04/30 14:31
总述:归并排序(Merging Sort)中归并是将两个或两个以上的有序表组合成一个新的有序表。
归并排序我们主要探讨2-路归并排序。
2-路归并排序 过程:假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到ceil(n/2)个长度为2或1的有序子序列;再两两归并,……如此重复,直至得到一个长度为n的有序序列为止。
2-路归并排序 过程演示:
算法叙述:
2-路归并排序中的核心操作是 归并操作,将一维数组中前后相邻的两个有序子序列归并为一个有序序列,其算法:
1、 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
2、设定两个指针,最初位置分别为两个已经排序序列的起始位置
3、比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
4、重复步骤3直到某一指针到达序列尾
5、将另一序列剩下的所有元素直接复制到合并序列尾
算法代码:
#include <stdio.h>#include <stdlib.h>#define MAXSIZE 20typedef int KeyType;//定义关键字类型为inttypedef char InfoType;//定义其他信息类型为chartypedef struct{//定义记录类型 KeyType key; InfoType otherinfo;}RedType;typedef struct{//定义顺序表类型 RedType r[MAXSIZE + 1];//r[0]闲置或作为哨兵 int length;//顺序表的长度}SqList;//此函数将两个相邻有序子序列SR[1...m]和SR[m+1...n]合并成一个有序的TR[i...n]void Merge(RedType SR[], RedType TR[], int i, int m, int n){ int j, k; //i指向子序列SR[1...m],j指向子序列SR[m+1...n],k指向合并序列TR[i...n] for (j=m+1,k=i;j<=n&&i<=m; k++){ if (SR[i].key<SR[j].key){//比较,将小的放入合并序列TR TR[k] = SR[i++];//把子序列值放到合并序列后,指针向后移动 } else{ TR[k] = SR[j++];//把子序列值放到合并序列后,指针向后移动 } } //将剩下的多余记录直接放到合并序列尾部 if (i<=m){//若子序列SR[1...m]有剩余 for (int x = i; x <= m; x++){ TR[k++] = SR[x]; } } if (j<=n){//若子序列SR[m+1...n]有剩余 for (int x = j; x <= m; x++){ TR[k++] = SR[x]; } }}//此函数将SR[s...t]归并为TR1[s...t]void MSort(RedType SR[], RedType TR1[], int s, int t){ int m; if (s==t){//当每个子序列只有一个记录时,直接将SR归并到TR1,递归终止 TR1[s] = SR[s]; }else{ m = (s + t) / 2;//将SR[s...t]平分为SR[s...m]和SR[m+1...t] MSort(SR, TR2, s, m);//递归地将SR[s...m]归并为有序的TR2[s...m] MSort(SR, TR2, m + 1, t);//递归地将SR[m+1...t]归并为有序的TR2[m+1...t] Merge(TR2, TR1, s, m, t);//将TR2[s...m]和TR2[m+1...t]归并到TR1[s...t] }}//对顺序表L作归并排序void MergeSort(SqList *L){ MSort(L->r, L->r, 1, L->length);}
评价:
1、实现归并排序需和待排记录等数量的辅助空间,其时间复杂度为O(nIogn)
2、与快速排序和堆排序相比,归并排序最大的特点是,它是一种稳定排序方法,
2、递归形式的算法形式上较为简洁,但实用性很差!
1 0
- 内部排序(四)归并排序
- 内部排序总结(四)归并排序
- 内部排序之四:归并排序
- 内部排序之四:归并排序和快速排序
- 归并排序(四)
- 归并排序(内部)总结
- 【数据结构与算法】内部排序之四:归并排序和快速排序(含完整源码)
- 内部排序之四:归并排序和快速排序(含完整源码)
- 内部排序之四:归并排序和快速排序(含完整源码)
- 【数据结构与算法】内部排序之四:归并排序和快速排序(含完整源码)
- 第十九篇:内部排序之四:归并排序和快速排序(含完整源码)
- 内部排序之归并排序(MergingSort)
- 内部排序算法4(归并排序)
- 排序(四)-归并排序
- 内部排序之归并排序
- 八大内部排序 -- 归并排序
- 内部排序—归并排序
- 内部排序算法:归并排序
- 【龙书答案】第三章解析(未完成)
- 解决升级Xcode6后插件不能用的问题
- 学习笔记:axure 高级教程 2 复选框(添加判断条件)
- 欢迎使用CSDN-markdown编辑器
- 从Code Review 谈如何做技术
- 内部排序(四)归并排序
- 文章标题
- 基于暗通道的图像去雾
- 黑马程序员——java基础——集合(一)
- iOS下的unit test——OCUnit
- 学习笔记:axure 高级教程 3 快捷键
- Hibernate实体关系映射——主键相同的一对一关系
- HTML中NAME与ID的区别
- Mysql的一条SQL优化(二)