Python3 实现归并排序

step1 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
step2 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题
step3 合并:将各个子问题的解合并为原问题的解。

Python
# -*- coding: utf-8 -*- """ @Time: 2018/4/11 @Author: songhao @微信公众号: zeropython @File: mergesort.py """ def mergesort(seq): """归并排序""" if len(seq) <= 1: return seq mid = len(seq) // 2 # 将列表分成更小的两个列表 # 分别对左右两个列表进行处理,分别返回两个排序好的列表 left = mergesort(seq[:mid]) right = mergesort(seq[mid:]) # 对排序好的两个列表合并,产生一个新的排序好的列表 return merge(left, right) def merge(left, right): """合并两个已排序好的列表,产生一个新的已排序好的列表""" result = [] # 新的已排序好的列表 i = 0 # 下标 j = 0 # 对两个列表中的元素 两两对比。 # 将最小的元素,放到result中,并对当前列表下标加1 while i < len(left) and j < len(right): if left[i] <= right[j]: result.append(left[i]) i += 1 else: result.append(right[j]) j += 1 # 当两个列表中的其中一个指针走完了,则剩余的列表直接追加到result result += left[i:] result += right[j:] return result seq = [5,3,0,6,1,4] print('排序前:',seq) result = mergesort(seq) print('排序后:',result)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# -*- coding: utf-8 -*-
"""
@Time: 2018/4/11
@Author: songhao
@微信公众号: zeropython
@File: mergesort.py
"""
 
def mergesort ( seq ) :
     """归并排序"""
     if len ( seq ) <= 1 :
         return seq
     mid = len ( seq ) / / 2    # 将列表分成更小的两个列表
     # 分别对左右两个列表进行处理,分别返回两个排序好的列表
     left = mergesort ( seq [ : mid ] )
     right = mergesort ( seq [ mid : ] )
 
     # 对排序好的两个列表合并,产生一个新的排序好的列表
     return merge ( left , right )
 
def merge ( left , right ) :
     """合并两个已排序好的列表,产生一个新的已排序好的列表"""
     result = [ ]    # 新的已排序好的列表
     i = 0    # 下标
     j = 0
     # 对两个列表中的元素 两两对比。
     # 将最小的元素,放到result中,并对当前列表下标加1
     while i < len ( left ) and j < len ( right ) :
         if left [ i ] <= right [ j ] :
             result . append ( left [ i ] )
             i += 1
         else :
             result . append ( right [ j ] )
             j += 1
     # 当两个列表中的其中一个指针走完了,则剩余的列表直接追加到result
 
     result += left [ i : ]
     result += right [ j : ]
     return result
 
seq = [ 5 , 3 , 0 , 6 , 1 , 4 ]
print ( '排序前:' , seq )
result = mergesort ( seq )
print ( '排序后:' , result )

 




  • zeropython 微信公众号 5868037 QQ号 5868037@qq.com QQ邮箱
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值