归并排序(MERGE_SORT)
来源:互联网 发布:环法自行车赛 知乎 编辑:程序博客网 时间:2024/06/03 20:25
归并排序(MERGE_SORT)
1)分治思想 :归并排序用到了一种称为分治法的设计方法,分治法的思想就是将原问题的分解成为几个规模小的但是类似于原问题的子问题,递归的求解子问题,之后再合并子问题的解,来组成原问题的解。
2)原理 :根据分治方法的思想,归并排序算法的基本操作分为三大步:分解,解决问题,合并结果。以一个需要排序的数组为例,分解也就是不停地递归分解问题,直到问题的规模降为1,然后开始合并。
3)C语言实现 :
void merge(int from, int mid, int to, int* a){ //新建了一个辅助的数组,用来暂时寄存merge时的数组 int left_top, right_top, index, count, *t; index = 0; //左半边的等待merge数组的顶端 left_top = from; //右半边的等待merge数组的顶端 right_top = mid + 1; //整个merge后的数组长度 count = to - from; t = (int*)malloc( (count + 1) * 2); //不断的从左右两个需要merge的子数组中取出顶端较小的数字 //直到其中一个数组取尽 while ((left_top <= mid) && (right_top <= to)) { if (a[left_top] < a[right_top]) { t[index++] = a[left_top++]; } else { t[index++] = a[right_top++]; } } //下面两个while循环 //作用是将还没有取尽的数组元素放入merge时的暂存数组中 while (left_top <= mid) { t[index++] = a[left_top++]; } while (right_top <= to) { t[index++] = a[right_top++]; } //将merge暂存数组的结果给原数组 for (int i = 0; i <= count; i++) { a[from++] = t[i]; }}void merge_sort(int from, int to, int* a){ if (from < to) { //分解问题 int mid = (from + to) / 2; merge_sort(from, mid, a); merge_sort(mid + 1, to, a); //开始合并 merge(from, mid, to, a); }}void main(){ int count, *p; printf("please input the count :"); scanf_s("%d", &count); p = (int *)malloc(count * 2); printf("\nplease input the number to be sorted : \n"); for (int i = 0; i < count; i++) { scanf_s("%d", p+i); } merge_sort(0, count-1, p); for (int i = 0; i < count; i++) { printf("%d ", p[i]); } system("pause");}
3)分析:上面实现的MERGE_SORT算法在输入的数字数量为奇数和偶数的时候都可以正常的工作,但是这里我们为了方便分析效率,将问题的规模假设为2的幂,在每次分解问题的时候都可以分成n/2。我们按照三个步骤来分析效率:
- 分解:分解步骤只需要找到数组的中间位置,因此时间是常数O(1)。
- 解决:分解之后,需要递归的求解两个规模为n/2的子问题,花费时间为2T(n/2)。
- 合并:将两个长度为n/2是的数组合并成一个长度为n的数组,相当于将n个元素都遍历了一遍,时间复杂度为O(n)。
因此我们可以写出T(n)和T(n/2)的关系表达式,T(n) = 2T(n/2) + cn(c为常数);后面会分析可以从这个式子导出T(n) = O(nlgn)。
0 0
- 归并排序Merge_Sort
- 归并排序MERGE_SORT
- 归并排序(MERGE_SORT)
- 归并排序(Merge_Sort)
- 归并排序/合并排序(merge_sort)详解
- 排序算法详解【归并排序-Merge_Sort】
- 排序算法详解【归并排序-Merge_Sort】
- 2路归并排序(MERGE_SORT)
- 【归并排序】 Merge_sort 实现源码 (自写)
- 排序算法之归并排序<Merge_Sort>及其C语言代码实现
- scala merge_sort排序
- merge_sort
- merge_sort
- merge_sort
- merge_sort
- Merge_sort
- 常见排序算法-php 1.归并排序 $a = [1, 4, 6, 8, 10, 14, 16]; $b = [2, 3, 5, 8, 9, 11]; function merge_sort($a,
- # INSERT_SORT&MERGE_SORT插入排序与归
- 【Facebook的UI开发框架React入门之六】单个View的布局与样式Style简介(iOS平台)-goodmao
- webView 加载视频_控制不全屏
- 字符串“改变”;
- scu oj 4441 Necklace(dp+树状数组)
- 我的论文
- 归并排序(MERGE_SORT)
- 欢迎使用CSDN-markdown编辑器
- 高精度-codevs-3115高精度练习之减法
- TCP、消息分包和协议设计
- 打印zigzag数组
- 打磨程序员的专属利器——命令行&界面
- 《30天编写自己的操作系统》 关于如何让虚拟机从U盘启动
- 选择排序
- R12 AR增值税和营业税的设置