python实现归并排序

  • 归并排序
    • 拆分:归并排序使用了递归的方法,将无序的数组拆分成两个组数,再对拆分后的数组进行拆分,这样,拆分后的数组又可以拆分为两个数组,直到每个数组的长度为1。
    • 合并:对拆分的数组,选择两个数组合并,将较小的数字排到左侧,较大的数字排到右侧,然后对新的数组和其他数组进行合并,直到所有的数组合并完成,就得到一个有序的数列。
  • python实现代码

建立随机数组生成程序:random_list.py

#-*- coding:utf-8 -*-
# Created Date: 2020/03/10

import random

def random_list(n):
        """返回一个长度为n的随机数列表,数值为[0,1000)"""
        print("Input number is :{}".format(n))
        iList = []
        for num in range(n):
                iList.append(random.randrange(1000))
        return iList
        
if __name__ == "__main__":
        iList = random_list(10)
        print(iList)

建立归并排序算法程序:merge_sort.py

#-*- coding:utf-8 -*-
#Created Date: 2020/03/16

from random_list import random_list
import timeit
import sys

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

def merge_sort(iList):
        '''建立拆分函数,将一个数列拆分成两个数列'''
        if len(iList) <= 1:
                return iList
        middle = len(iList)//2
        left, right = iList[0:middle], iList[middle:]
        """        通过递归的方式,调用merge_sort()函数,将拆分后的数列继续不停的拆分,直到每个数列长度为1
        然后调用merge_list()函数,将拆分的数列合并排序为1个数列
        """
        return merge_list(merge_sort(left), merge_sort(right))
        
def merge_list(left, right):
        '''建立合并函数,将两个数列合并成一个数列'''
        mList = []
        while left and right:
                if left[0] >= right[0]:
                        mList.append(right.pop(0))
                else:
                        mList.append(left.pop(0))
        while left:
                mList.append(left.pop(0))
        while right:
                mList.append(right.pop(0))
        return mList

if __name__ == "__main__":
        print("source list: {}".format(iList))
        print("sorted results: {}".format(merge_sort(iList)))
        print(timeit.timeit("merge_sort(iList)", "from __main__ import merge_sort, iList", number = 1000))

在命令行输入指令:

python merge_sort.py 10

得到排序结果为:

Input number is :10
source list: [703, 936, 227, 427, 471, 74, 114, 797, 635, 329]
sorted results: [74, 114, 227, 329, 427, 471, 635, 703, 797, 936]
0.0283238
发布了9 篇原创文章 · 获赞 0 · 访问量 287
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览