排序 -- 归并排序
来源:互联网 发布:铁拳3知乎 编辑:程序博客网 时间:2024/05/29 16:31
归并排序 MergingSort
平均、最好、最坏:O(nlogn)
辅助空间:O(n) 申请了空间
最大的特点:稳定的改进算法
归并排序:强调要马跑得快,就得给马吃个饱,哈哈
算法思想:假设初始序列含有n个记录,则可以堪称n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n / 2]个长度为2或者1的有序子序列;再两两归并,重复,直到得到一个长度为n的有序序列为止。这是2路归并排序。分治法的典型应用。
简单来说,就是先划分子表,再合并半子表
代码如下,C++,采用递归解决方案:
// 将有序的a[start..mid]和a[mid+1..end]归并为有序的t[start..end]void merge(int *a, int *t, int start, int mid, int end){int i, j, k;for(i=mid+1,j=start; start<=mid && i<=end; ++j){if(a[start] < a[i])t[j] = a[start++];elset[j] = a[i++];}if(start <= mid){for(k=0; k<= mid-start; ++k)t[j+k] = a[start+k];}if(i <= end){for(k=0; k<=end-i; ++k)t[j+k] = a[i+k];}}//归并排序 a为待排数组,t为目标数组void merge_sort(int *a, int *t, int startIndex, int endIndex){int mid;int temp[100] = {0};if(startIndex == endIndex){t[startIndex] = a[startIndex];} else{mid = (startIndex + endIndex) / 2;merge_sort(a, temp, startIndex, mid);merge_sort(a, temp, mid+1, endIndex);merge(temp, t, startIndex, mid, endIndex);}}
int a[Num]; for(int i=0; i<Num; i++) { a[i] = rand()%100 + 1; } int length = sizeof(a)/sizeof(*a); //归并排序 int b[Num]; merge_sort(a, b, 0, length-1);
- 归并排序-归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- Android Studio 不自动弹起代码提示功能解决办法 do not auto popup code completion
- 如何在SAE上安装原版wordpress
- sqlplus "/ as sysdba" 连不上,报ora-01031:insufficient privileges解决方法
- 随机数——Linux C编程
- 09-DIV+CSS-流和盒子模型初识
- 排序 -- 归并排序
- ANR的一些数据总结
- 4-表管理
- MySQL数据库文件介绍
- highcharts多个Y轴
- 瞬时响应:网站的高性能架构
- 什么是P问题、NP问题和NPC问题
- java poi 大批量数据处理,2007
- StringBuffer