二路归并排序算法
来源:互联网 发布:互联网公司数据分析 编辑:程序博客网 时间:2024/06/05 10:56
将两个按值有序序列合并成一个按值有序序列,则称之为二路归并排序,下面有自底向上和自顶向下的两种排序算法,自顶向下的排序在本文末讲述,使用递归实现,代码较简洁,经供参考。
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
- 二路归并排序算法
- 二路归并排序算法
- 二路归并排序算法
- 排序算法之二路归并排序
- 排序算法之二路归并排序
- 排序算法之二路归并排序
- 排序算法之二路归并排序
- 实现二路归并排序算法
- 【数据结构与算法】二路归并排序
- 经典算法之二路归并排序
- 插入排序算法&二路归并排序算法java实现
- 归并排序:二路归并
- 归并排序--二路归并
- 【Data_Structure笔记6】排序算法之【二路归并排序】
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- log4j输出多个自定义日志文件,动态配置路径
- 将博客搬至博客园
- 蓝桥杯 ALGO-124 算法训练 数字三角形
- 穷举法,实例4,生日蜡烛236根
- 最大子列和问题
- 二路归并排序算法
- QT 怎样获取当前工程的路径
- 【自考】计算机网络原理(一)
- 蓝桥杯 ALGO-43 算法训练 A+B Problem
- leetcode 345. Reverse Vowels of a String
- [勇者闯LeetCode] 13. Roman to Integer
- 转载:应该考虑进行何种测试
- 抢红包
- Project Lombok