2路归并排序算法(C语言)
来源:互联网 发布:js怎么遍历对象数组 编辑:程序博客网 时间:2024/06/06 03:37
转载自:http://blog.csdn.net/caryaliu/article/details/7475700
将两个按值有序序列合并成一个按值有序序列,则称之为二路归并排序,下面有自底向上和自顶向下的两种排序算法,自顶向下的排序在本文末讲述,使用递归实现,代码较简洁,经供参考。
1. 归并子算法:把位置相邻的两个按值有序序列合并成一个按值有序序列。例如把序列 X[s..u] = {3, 12, 23, 32}和 序列 X[u+1..v] = {2, 5, 8, 99} 合并成序列
Z[s..v] = {2, 3, 5, 8, 12, 23, 32, 99}, 注意合并前的元素都位于同一个有序序列的相邻位置,合并后的有序序列的下标与合并前的序列总的起始下标相同。
算法过程中需要三个整型变量,i 用来遍历归并的前一个有序序列,其初始位置是s;j 用来遍历归并的后一个有序序列,其初始值是u+1;q 用来指出归并后得到的有序序列的末尾元素的位置,其初始值是s。当遍历完成其中的一个有序序列之后,只需把另一个未结束有序序列的剩余元素复制到合并后的有序序列的末尾。
看代码:
2. 一趟归并扫描子算法:将参加排序的序列分成若干个长度为 t 的,且各自按值有序的子序列,然后多次调用归并子算法merge将所有两两相邻成对的子序列合并成若干个长度为
2t 的,且各自按值有序的子序列。
若某一趟归并扫描到最后,剩下的元素个数不足两个子序列的长度时:
- 若剩下的元素个数大于一个子序列的长度 t 时,则再调用一次归并子算法 merge 将剩下的两个不等长的子序列合并成一个有序子序列
- 若剩下的元素个数小于或者等于一个子序列的长度 t 时,只须将剩下的元素依次复制到前一个子序列后面。
看代码:
3. 二路归并排序算法:将参加排序的初始序列分成长度为1的子序列使用mergePass函数进行第一趟排序,得到 n / 2 个长度为 2 的各自有序的子序列(若n为奇数,还会存在一个最后元素的子序列),再一次调用mergePass函数进行第二趟排序,得到 n / 4 个长度为 4 的各自有序的子序列, 第 i 趟排序就是两两归并长度为 2^(i-1) 的子序列得到 n / (2^i) 长度为 2^i 的子序列,直到最后只剩一个长度为n的子序列。由此看出,一共需要 log2n 趟排序,每一趟排序的时间复杂度是 O(n), 由此可知
该算法的总的时间复杂度是是 O(n log2n),但是该算法需要 O(n) 的辅助空间,空间复杂度很大,是 O(n).
看代码:
该算法的总的时间复杂度是是 O(n log2n),但是该算法需要 O(n) 的辅助空间,空间复杂度很大,是 O(n).
看代码:
程序总的代码汇总:
归并排序自顶向下排序,仅供参考:
0 0
- 2路归并排序算法(C语言)
- 排序算法系列:归并排序(Merge sort)(C语言)
- C语言------排序算法------归并排序(六)
- 归并排序的实现(排序算法c语言描述)
- 排序算法c语言描述---归并排序
- C语言实现2路归并排序
- 【算法】归并--C语言实现归并排序递归算法
- 二路归并排序算法实现-完整C语言程序
- 算法导论 之 归并排序[C语言]
- 【算法导论】归并排序,C语言实现
- C语言--归并排序算法实现
- C语言归并排序算法的实现
- C语言实现归并排序算法
- 归并排序(C语言)
- 归并排序(C语言)
- 归并排序(C语言)
- 归并排序(c语言)
- 算法 - 归并排序(C#)
- html的canvas使用,时钟绘图总结
- PVANET: Deep but Lightweight Neural Networks for Real-time Object Detection
- 用eclipse编译,结果出现“错误:找不到或无法加载主类”
- java 设计模式 —— 浅析状态模式
- iOS面试题
- 2路归并排序算法(C语言)
- C# 程序关闭托盘图标不会自动消失
- java文件操作
- lintcode(E) 二叉树最小深度
- Bellman-Ford单源最短路径+优化
- 深度学习框架Caffe源码解析
- java多线程之join
- 基于TI-RTOS的CC2650DK开发(11)---信号量
- 哈夫曼编码/译码的设计与实现