二、Merge sort
1 问题
2 算法
2.1 伪代码
2.2 算法思想
2.3 手工演示
2.4 Python实现
# -*- coding: utf-8 -*-
import sysdef merge(A, p, q, r):n1 = q - p + 1n2 = r - qL = [0] * (n1 + 2)R = [0] * (n2 + 2)for i in range(1, n1+1):L[i] = A[p+i-1]for j in range(1, n2+1):R[j] = A[q+j]L[n1+1] = 65536R[n2+1] = 65536i = 1j = 1for k in range(p, r+1):if L[i] <= R[j]:A[k] = L[i]i = i + 1else:A[k] = R[j]j = j + 1def merge_sort(A, p, r):if p < r:q = (p + r) // 2merge_sort(A, p, q)merge_sort(A, q+1, r)merge(A, p, q, r)if __name__ == '__main__':input_str = sys.stdin.readline().split()A = list(map(int, input_str))A.insert(0, 'x') # 为了使数组从1开始n = len(A) - 1print('Before sort:')print(A[1:])print('After sort:')merge_sort(A, 1, n)print(A[1:])
3 算法分析
怎样解这个递归式子?书中借用“tree”这种结构做算法分析,下一节的master定理也是用“tree”来分析的,这种分析方法,贯穿了整个《算法导论》全书,是非常有艺术性和创造性的一种方法,本小节只用“tree”直观说明,严谨一些的数学细节见下一节的master定理。
关于这个tree有一些说明:
- 树的高度h=lg(n)h=lg(n)h=lg(n);
- 叶子结点个数#leaves=n\#leaves=n#leaves=n;
- 非叶子结点表示merge所花费的时间,并且每一行所花费的时间总和都是cncncn,叶子结点表示排序一个数字所花费的时间Θ(1)\Theta(1)Θ(1),最后一行排序每一个数字所花费的总时间是Θ(n)\Theta(n)Θ(n);
- 把所有的结点加起来T(n)=h∗(cn)+Θ(n)=Θ(nlgn)T(n)=h*(cn)+\Theta(n)=\Theta(nlgn)T(n)=h∗(cn)+Θ(n)=Θ(nlgn);
二、Merge sort相关推荐
- 排序算法二:归并排序(Merge sort)
归并排序(Merge sort)用到了分治思想,即分-治-合三步,算法平均时间复杂度是O(nlgn). (一)算法实现 1 private void merge_sort(int[] array, i ...
- python代码实现归并排序(Merge Sort )
python代码实现归并排序(Merge Sort ) 归并排序(Merge Sort) 归并排序,是创建在归并操作上的一种有效的排序算法.算法是采用分治法(Divide and Conquer)的一 ...
- [算法]——归并排序(Merge Sort)
归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...
- C语言merge sort归并排序算法(附完整源码)
C语言merge sort归并排序算法 merge sort归并排序算法的完整源码(定义,实现) merge sort归并排序算法的完整源码(定义,实现) #ifndef MERGE_SORT_H # ...
- C++使用Merge Sort排序计数反转的实现算法(附完整源码)
C++使用Merge Sort排序计数反转的实现算法 C++使用Merge Sort排序计数反转的实现算法完整源码(定义,实现,main函数测试) C++使用Merge Sort排序计数反转的实现算法 ...
- C语言以递归实现归并排序Merge Sort算法(附完整源码)
以递归实现归并排序Merge Sort 以递归实现归并排序Merge Sort算法的完整源码(定义,实现,main函数测试) 以递归实现归并排序Merge Sort算法的完整源码(定义,实现,main ...
- C语言归并排序Merge Sort算法(附完整源码)
归并排序Merge Sort 归并排序Merge Sort算法的完整源码(定义,实现,main函数测试) 归并排序Merge Sort算法的完整源码(定义,实现,main函数测试) #include ...
- php 二维sort,php 二维数组排序
前提 给定一个二维数组,请根据指定的数组key,写出最优的排序.排序条件age asc,sex desc,指定数组如下: $arr = [ ['id'=>1, 'age'=>1, 'sex ...
- python选择排序算法图解_python基本算法之实现归并排序(Merge sort)
0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...
- python 归并排序算法_python基本算法之实现归并排序(Merge sort)
0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...
最新文章
- percona server修改数据目录datadir为/data/mysql:
- 作用域和闭包的通俗理解
- chrome 播放视频提示 adobe flash player已过期或者adobe flash player 没有安装
- python 多数据输出到txt_python-BeautifulSoup输出到.txt文件
- 把代码push到github所遇到的问题
- spark算子_Spark 性能优化(四)——程序开发调优
- MVC利用URLRoute实现伪静态后正真的静态html无法访问
- Luogu2730 魔板 Magic Squares
- 使用java实现敏感词汇过滤功能
- 《微信背后的产品观》一书
- 记Dorado7学习(5)
- Laragon 自定义域名
- uniapp自定义步骤条
- originPro2021(8)在图中加直线方便查看数据
- 多线程是啥?有啥用?(上)
- 计算机无法自动排列,win10系统文件夹不自动排列的解决方法
- 话费充值api接口,对接流程
- NTP 网络时间协议
- linux mp3插件名,Linux 福利:TAL Software 八款插件开始支持 Linux ,其中有两款免费...
- 文献管理与信息分析(课堂笔记前六章)