查看: 1577|回复: 2
收起左侧

[资料分享] 【排序】归并排序法python实现

Lihoon 2020-3-17 20:09:52 | 显示全部楼层 |阅读模式
邀请回答

马上注册,享受更多特权

您需要 登录 才可以下载或查看,没有帐号?立即注册   

x
本帖最后由 Lihoon 于 2020-3-17 20:15 编辑

归并排序通过不停的将数列分隔为两个较短的数列,直至每个数列的个数为1, 长度为1 的数列必然是有序数列;然后将两个有序数列合并成一个新的有序数列,依次递归,直至所有数列合并为1个数列。
生成随机数组的程序:random_list.py 请参考:
http://bbs.inovance.com/forum.php?mod=viewthread&tid=1925&extra=page%3D1
http://bbs.inovance.com/forum.php?mod=viewthread&tid=1896&extra=page%3D1
建立归并排序的程序:merge_sort.py
  1. #-*- coding:utf-8 -*-
  2. #Created Date: 2020/03/16

  3. from random_list import random_list
  4. import timeit
  5. import sys

  6. num = sys.argv[1]
  7. iList = random_list(int(num))

  8. def merge_sort(iList):
  9.         '''建立拆分函数,将一个数列拆分成两个数列'''
  10.         if len(iList) <= 1:
  11.                 return iList
  12.         middle = len(iList)//2
  13.         left, right = iList[0:middle], iList[middle:]
  14.         """        通过递归的方式,调用merge_sort()函数,将拆分后的数列继续不停的拆分,直到每个数列长度为1
  15.         然后调用merge_list()函数,将拆分的数列合并排序为1个数列
  16.         """
  17.         return merge_list(merge_sort(left), merge_sort(right))
  18.         
  19. def merge_list(left, right):
  20.         '''建立合并函数,将两个数列合并成一个数列'''
  21.         mList = []
  22.         while left and right:
  23.                 if left[0] >= right[0]:
  24.                         mList.append(right.pop(0))
  25.                 else:
  26.                         mList.append(left.pop(0))
  27.         while left:
  28.                 mList.append(left.pop(0))
  29.         while right:
  30.                 mList.append(right.pop(0))
  31.         return mList

  32. if __name__ == "__main__":
  33.         print("source list: {}".format(iList))
  34.         print("sorted results: {}".format(merge_sort(iList)))
  35.         print(timeit.timeit("merge_sort(iList)", "from __main__ import merge_sort, iList", number = 1000))
复制代码
在命令行输入指令:
  1. python merge_sort.py 10
复制代码
得到排序结果为:
  1. Input number is :10
  2. source list: [703, 936, 227, 427, 471, 74, 114, 797, 635, 329]
  3. sorted results: [74, 114, 227, 329, 427, 471, 635, 703, 797, 936]
  4. 0.0283238
复制代码





上一篇:【排序】快速排序法python实现
下一篇:【排序】计数排序法python实现

已有 0 人打赏作者

回复 邀请回答送花

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册   

本版积分规则

有技术问题,就上汇川技术社区

INOVANCE汇川技术 公众号

扫码下载掌上汇川APP

全国服务热线:8:30-17:30

4000-300124

苏州地址:江苏省苏州市吴中区越溪友翔路16号

深圳地址:深圳市龙华新区观澜街道高新技术产业园汇川技术总部大厦

Copyright © 2003-2100 汇川技术 Powered by Discuz! X3.4 ( 苏ICP备12002088号 )
快速回复 返回列表 返回顶部