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有一些说明:

  1. 树的高度h=lg(n)h=lg(n)h=lg(n);
  2. 叶子结点个数#leaves=n\#leaves=n#leaves=n;
  3. 非叶子结点表示merge所花费的时间,并且每一行所花费的时间总和都是cncncn,叶子结点表示排序一个数字所花费的时间Θ(1)\Theta(1)Θ(1),最后一行排序每一个数字所花费的总时间是Θ(n)\Theta(n)Θ(n);
  4. 把所有的结点加起来T(n)=h∗(cn)+Θ(n)=Θ(nlgn)T(n)=h*(cn)+\Theta(n)=\Theta(nlgn)T(n)=h∗(cn)+Θ(n)=Θ(nlgn);

二、Merge sort相关推荐

  1. 排序算法二:归并排序(Merge sort)

    归并排序(Merge sort)用到了分治思想,即分-治-合三步,算法平均时间复杂度是O(nlgn). (一)算法实现 1 private void merge_sort(int[] array, i ...

  2. python代码实现归并排序(Merge Sort )

    python代码实现归并排序(Merge Sort ) 归并排序(Merge Sort) 归并排序,是创建在归并操作上的一种有效的排序算法.算法是采用分治法(Divide and Conquer)的一 ...

  3. [算法]——归并排序(Merge Sort)

    归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...

  4. C语言merge sort归并排序算法(附完整源码)

    C语言merge sort归并排序算法 merge sort归并排序算法的完整源码(定义,实现) merge sort归并排序算法的完整源码(定义,实现) #ifndef MERGE_SORT_H # ...

  5. C++使用Merge Sort排序计数反转的实现算法(附完整源码)

    C++使用Merge Sort排序计数反转的实现算法 C++使用Merge Sort排序计数反转的实现算法完整源码(定义,实现,main函数测试) C++使用Merge Sort排序计数反转的实现算法 ...

  6. C语言以递归实现归并排序Merge Sort算法(附完整源码)

    以递归实现归并排序Merge Sort 以递归实现归并排序Merge Sort算法的完整源码(定义,实现,main函数测试) 以递归实现归并排序Merge Sort算法的完整源码(定义,实现,main ...

  7. C语言归并排序Merge Sort算法(附完整源码)

    归并排序Merge Sort 归并排序Merge Sort算法的完整源码(定义,实现,main函数测试) 归并排序Merge Sort算法的完整源码(定义,实现,main函数测试) #include ...

  8. php 二维sort,php 二维数组排序

    前提 给定一个二维数组,请根据指定的数组key,写出最优的排序.排序条件age asc,sex desc,指定数组如下: $arr = [ ['id'=>1, 'age'=>1, 'sex ...

  9. python选择排序算法图解_python基本算法之实现归并排序(Merge sort)

    0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...

  10. python 归并排序算法_python基本算法之实现归并排序(Merge sort)

    0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...

最新文章

  1. percona server修改数据目录datadir为/data/mysql:
  2. 作用域和闭包的通俗理解
  3. chrome 播放视频提示 adobe flash player已过期或者adobe flash player 没有安装
  4. python 多数据输出到txt_python-BeautifulSoup输出到.txt文件
  5. 把代码push到github所遇到的问题
  6. spark算子_Spark 性能优化(四)——程序开发调优
  7. MVC利用URLRoute实现伪静态后正真的静态html无法访问
  8. Luogu2730 魔板 Magic Squares
  9. 使用java实现敏感词汇过滤功能
  10. 《微信背后的产品观》一书
  11. 记Dorado7学习(5)
  12. Laragon 自定义域名
  13. uniapp自定义步骤条
  14. originPro2021(8)在图中加直线方便查看数据
  15. 多线程是啥?有啥用?(上)
  16. 计算机无法自动排列,win10系统文件夹不自动排列的解决方法
  17. 话费充值api接口,对接流程
  18. NTP 网络时间协议
  19. linux mp3插件名,Linux 福利:TAL Software 八款插件开始支持 Linux ,其中有两款免费...
  20. 文献管理与信息分析(课堂笔记前六章)

热门文章

  1. 灰度重采样(Gray Resampling
  2. FPGA Verilog实现一个脉冲波形变换
  3. 移动端click延迟和tap事件
  4. 我的世界光影mod怎么用_玩转光影!闪光灯、反光板怎么用才高级?
  5. python常用函数的用法_python3 文件操作常用函数用法示例
  6. Ajax技术简单入门
  7. Python3爬虫(十一) 爬虫与反爬虫
  8. oracle 用户管理
  9. [转]cubemap soft shadow
  10. 算法之递推及其应用(递推关系的建立及在信息学竞赛中的应用 安徽 高寒蕊)...