排序算法之归并排序
来源:互联网 发布:mysql 修改字段长度 编辑:程序博客网 时间:2024/06/14 12:15
思想:
1. 基于分治法 2. 将待排序序列每次进行两两划分 3. 将划分好的序列进行两两合并,并且在合并的过程中进行排序r
性能
1. 时间复杂度: * merge函数中递归是一个完全二叉树:log2n * 里面还有一个合并的while循环n * 时间复杂度 = O(nlogn) 2. 空间复杂度 * 与原始记录序列同样数量的存储空间存放归并结果 * 递归时深度为logcn的栈空间 * 空间复杂度:O(n+logn) 3. 稳定性: * 需要两两比较,不存在跳跃 * 稳定
代码
void mergeSort(int a[],int l,int r,int m){ int L1 = m-l+1;//要合并的第一个子数组的长度 int R1 = r-m;//要合并的第二个子数组的长度 int L[L1];//要合并的第一个子数组 int R[R1];//要合并的第二个子数组 //将分成的两部分分别放入L和R中 for (int i = 0; i<L1; i++) { L[i] = a[l+i];//因为合并的两个数组的左边的数组不一定从0开始,所以一定要加上l } for (int j = 0; j<R1; j++) { R[j] = a[m+j+1]; } //合并两个数据 int k = l;//k一定要等于l,因为左半边不一定是从0开始的 int i = 0; int j = 0; while (i<L1 &&j<R1) { if (L[i]<R[j]) { a[k++] = L[i++]; } else{ a[k++] = R[j++]; } } //因为两个数组长度可能不一样,如果那个没有遍历完,就把它放入到合并好的数组的后面 while (i<L1) { a[k++] = L[i++]; } while (j<R1) { a[k++] = R[j++]; }}//归并排序void merge(int a[],int l,int r){ if (l<r) { //先将待排序数组进行划分,每次划分为2部分 int m = (l+r)/2; merge(a, l, m); merge(a, m+1, r); //对划分好的子数组两两合并排序 mergeSort(a, l, r, m); }}
阅读全文
0 0
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- HDU3692--least common multiple(数论优化+分组背包);DP--数论
- 1024
- leetcode 225. Implement Stack using Queues
- 泊松分酒--蓝桥杯java历年真题
- 正则表达式
- 排序算法之归并排序
- canvas
- C# datatable过滤某一列的重复数据(相当于distinct)
- Android5.0 framework 灯光系统 -- 电池灯源码分析
- 2017.8.11暑假集训第十二天
- 勇哥叫你spring
- 计蒜客 递推
- Oracle 伪列: ROWNUM 应用与总结
- Ajax