文章同步发布于博客

从头开始复习算法有一段时间了,有输入也要有输出。除了交编程作业以外,也要整理自己的笔记。

归并排序,使用分治的思想,将原问题折半分解为子问题,再使用同样的算法解决子问题。

总体思路

如果数组长度为 1,就返回该数组。

如果不是 1,则将数组折半,对每一半执行归并排序,将排好序的数组存在两个变量里。

之后,通过归并算法将两个数组拼合成一个排好序的数组。

返回该排好序的数组。

递归过程中,数组会被逐层拆分,直到每一个子问题都变为长度为一的数组,此时,每一个子问题的数组都是排好序的了(因为就一个元素),就会触发拼合操作。

将两个已排好序的数组拼合的过程如下:

创建一个长度为两数组长度之和的空数组。

比较两个数组的头元素,将小的那个移至新数组非空部分的末尾。循环执行直至其中一个数组的元素全部被挪走。

将剩余的部分按序挪至新数组的末尾。

这样就得到了一个合并之后的排好序的数组。

再逐层递归执行合并操作,直到最后将原数组排好序。

伪代码:

MergeSort(A[1...n])

if n == 1:

return A

m = floor(n/2)

B = MergeSort(A[0...m])

C = MergeSort(A[m+1...n])

A' = Merge(B, C)

return A'

Merge(B[1...p], C[1...q])

// B and C are sorted

D = empty array of size p+q

while B and C are both not empty:

b = B[0]

c = C[0]

if b <= c:

move b to the end of D

else:

move c to the end of D

// after the while loop, one of the two array is now empty

move the rest of B or C to the end of D

return D

复制代码

Python 3 实现:

可以存储至本地文件然后运行查看结果

def MergeSort(A):

if len(A) == 1:

return A

m = len(A) // 2

B = MergeSort(A[0:m])

C = MergeSort(A[m:len(A)])

A_new = Merge(B, C)

return A_new

def Merge(B, C):

D = [None] * (len(B)+len(C))

i = 0

j = 0

while i < len(B) and j < len(C):

b = B[i]

c = C[j]

if b <= c:

D[i+j] = b

i += 1

else:

D[i+j] = c

j += 1

while i < len(B):

D[i+j] = B[i]

i += 1

while j < len(C):

D[i+j] = C[j]

j += 1

return D

if __name__ == '__main__':

a = [1, 3, 7, 2, 9, 6, 8, 10, 1, 2, 5]

sorted_A = MergeSort(a)

print(sorted_A)

复制代码

JavaScript 实现

同样可以保存文件,然后通过 node 命令运行

function mergeSort(array){

if (array.length === 1)

return array

let m = Math.floor(array.length / 2)

let B = mergeSort(array.slice(0, m))

let C = mergeSort(array.slice(m, array.length))

let A_sorted = merge(B, C)

return A_sorted;

}

function merge(B, C){

let i = 0

let j = 0

let D = []

while(i < B.length && j < C.length){

if (B[i] <= C[j]){

D.push(B[i++])

} else {

D.push(C[j++])

}

}

while (i < B.length) D.push(B[i++])

while (j < C.length) D.push(C[j++])

return D

}

let a = mergeSort([1, 4, 2, 8, 345, 123, 43, 32, 5643, 63, 123, 43, 2, 55, 1, 234, 92]);

console.log(a)

复制代码

python归并排序算法实现_排序算法之归并排序(附 Python 与 JS 实现)相关推荐

  1. java 快速排序算法简单_排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序......

    先推荐一篇关于排序算法的文章:http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html 本文思路部分来源于上篇文章,但测得的结果似乎 ...

  2. java排序算法总结_排序算法总结及Java实现

    1. 整体介绍 分类 排序大的分类可以分为两种,内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.主要需要理解的都是内排序算法: 内排序可以分为 ...

  3. java排序算法原理_排序算法原理与实现(java)

    排序算法原理与实现(java) Java程序员必知的8大排序 [来源:本站 | 日期:2012年12月24日 | 浏览173 次] 字体:[大 中 小] 8种排序之间的关系: 1, 直接插入排序 (1 ...

  4. python排序算法实现_排序算法整理(Python实现)

    1. 冒泡排序 冒泡排序(Bubble Sort)是稳定排序,其基本思想是:遍历待排序列,依次两两比较,如果顺序错误就交换.如果从头开始遍历,把较大的交换到后面,结果就是越大的数据越往下沉,所以也可以 ...

  5. 结合内存分析java归并排序_排序算法之归并排序(Mergesort)解析

    一.归并排序的优缺点(pros and cons) 耗费心思来理解它,总要有个理由吧:归并排序的效率达到了巅峰:时间复杂度为O(nlogn),这是基于比较的排序算法所能达到的最高境界 归并排序是一种稳 ...

  6. 利用Python实现十大经典排序算法(附代码流程)

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 作者:hustcc 来源:https://github.com/hustcc/JS ...

  7. 排序中减治法算法伪代码_【算法与数据结构】伪代码与流程图

    js难的是抽象概念 编程语言也能抽象 JS Python java PHP 根本就没区别 这些语言都有 声名 if...else while 循环 for 循环 函数 对象 这意味着 你没有必要过分关 ...

  8. python高阶函数——sorted排序算法

    python高阶函数--sorted排序算法 python 内置的sorted()函数可以对一个list进行排序: >>> sorted([8,3,8,11,-2]) [-2, 3, ...

  9. Python:实现gnome sortt侏儒排序算法(附完整源码)

    Python:实现gnome sortt侏儒排序算法 def gnome_sort(lst: list) -> list:if len(lst) <= 1:return lsti = 1w ...

  10. Python:实现natural sort自然排序算法(附完整源码)

    Python:实现natural sort自然排序算法 from __future__ import annotationsimport re msd radix sortdef natural_so ...

最新文章

  1. 1102示波器使用方法_你知道示波器的探头是怎样工作的吗?示波器探头的使用方法...
  2. 在线教育后端开发项目总结
  3. 信安精品课:第7章访问控制技术原理与应用精讲笔记
  4. 为什么不邀请我参加会议?
  5. 理论 | 六种延迟队列的实现方案
  6. oracle到pg不停机增量迁移,研究 Oracle 到 PostgreSQL 的数据迁移 – 以 pgloader 为例 – Phy 的博客...
  7. 绝地仙王986服务器维护到几点,绝世仙王————【维护】1月12日更新维护公告...
  8. day4(继承、修饰符、方法的重写、super关键词、继承中的构造方法、object类、对象转型)...
  9. jquery $.post 超时_详解如何实现前端jquery中的ajax方法,看这一篇就够了
  10. 利用ES4封装Windows10
  11. Frobenius自同构
  12. 同是匿名社交,国内外“秘密”大不同
  13. 微信视频号视频怎么下载保存到手机相册?
  14. 笔记本外接显示器没有声音
  15. 高性能信号发生器介绍
  16. Windows C盘清理方法
  17. Java线程池(超详细)
  18. linux系统盘的概念,了解linux系统硬盘分区概念-SELinux入门-linux网卡配置及参数学习_169IT.COM...
  19. python机器学习基础05——sklearn之逻辑回归+分类评价指标
  20. python做统计分析_用Python做数据分析,Numpy,Pandas,matp

热门文章

  1. 各位玩新浪的SAE的 请点个关注http://weibo.com/i/2062352633
  2. YII 学习笔记(2)(未完)
  3. python访问服务器注册表,使用Python的Windows注册表访问(Winreg)
  4. mysql悲观锁和乐观使用实例_MySQL 悲观锁和乐观锁
  5. char **p作为参数被修改_opencv第1课-加载、修改、保存图像
  6. hadoop api 复制文件_Hadoop核心架构是怎样的?
  7. JavaSE基础篇之-Java 流(Stream)、文件(File)和IO
  8. Java多态的理解,真实开发详解,带编程,通俗白话文,简单易懂
  9. Java 后端MD5加密
  10. java实现水仙花数int_java实现水仙花数的计算|chu