博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构(python) —— 【14: 归并排序】
阅读量:3940 次
发布时间:2019-05-24

本文共 2640 字,大约阅读时间需要 8 分钟。

归并排序

上一博文讲了如何使用归并排序进行一次排序即一次归并(列表分两段有序,将其合成为一个有序列表这种操作称为一次归并)

今天来讲讲,怎么利用归并排序将一个无序列表进行排序!

代码:

# _*_coding:utf-8_*_'''TOPIC: 归并author: Bluetime: 2020-08-05QQ: 2458682080'''import random# 一次归并def merge(li, low, mid, high):    i = low    j = mid + 1    li_temp = []    while i <= mid and j <= high:   # 只要左右两边都有数        if li[i] < li[j]:            li_temp.append(li[i])            i += 1        else:            li_temp.append(li[j])            j += 1    # while执行完,肯定有一部分没数了    while i <= mid:   # 左边有数,右边没数        li_temp.append(li[i])        i += 1    while j <= high:  # 右边有数,左边没数        li_temp.append(li[j])        j += 1    li[low: high+1] = li_tempdef mergr_sort(li, low, high):    if low < high:   # 至少有两个元素,递归        mid = (low + high) // 2        mergr_sort(li, low, mid)      # 1. 把左边排好序        mergr_sort(li, mid+1, high)   # 2. 把右边排好序        merge(li, low, mid, high)     # 3. 把左右归并li = list(range(10))random.shuffle(li)print(li)mergr_sort(li, 0, len(li)-1)print(li)

结果为:

[8, 6, 7, 9, 1, 2, 5, 0, 3, 4][0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

思路:

  1. 分解:将列表越分越小,直至分成一个元素。
  2. 终止条件:一个元素是有序的。
  3. 合并:将两个有序列表归并,列表越来越大。

    利用递归,将列表划分到最小单元进行排序,比如一个长度为10的无序列表:

归并排序由于过程较多,这里我只展示了前面几步的递归过程,但是理解了这几步过程,后面过程也就可以理解了。

或者可以利用打印排序过程来帮助理解这个过程:

# _*_coding:utf-8_*_'''TOP: 归并author: Bluetime: 2020-08-05QQ: 2458682080'''import random# 一次归并def merge(li, low, mid, high):    i = low    j = mid + 1    li_temp = []    while i <= mid and j <= high:   # 只要左右两边都有数        if li[i] < li[j]:            li_temp.append(li[i])            i += 1        else:            li_temp.append(li[j])            j += 1    # while执行完,肯定有一部分没数了    while i <= mid:   # 左边有数,右边没数        li_temp.append(li[i])        i += 1    while j <= high:  # 右边有数,左边没数        li_temp.append(li[j])        j += 1    li[low: high+1] = li_temp# 查看每一次左右归并后的结果def mergr_sort_test(li, low, high):    if low < high:   # 至少有两个元素,递归        mid = (low + high) // 2        mergr_sort_test(li, low, mid)      # 1. 把左边排好序        mergr_sort_test(li, mid+1, high)   # 2. 把右边排好序        print(li[low: high+1])        merge(li, low, mid, high)        print(li)li = list(range(10))random.shuffle(li)print(li)mergr_sort_test(li, 0, len(li)-1)print(li)

结果为:

[8, 7, 2, 5, 1, 3, 0, 6, 4, 9][8, 7][7, 8, 2, 5, 1, 3, 0, 6, 4, 9][7, 8, 2][2, 7, 8, 5, 1, 3, 0, 6, 4, 9][5, 1][2, 7, 8, 1, 5, 3, 0, 6, 4, 9][2, 7, 8, 1, 5][1, 2, 5, 7, 8, 3, 0, 6, 4, 9][3, 0][1, 2, 5, 7, 8, 0, 3, 6, 4, 9][0, 3, 6][1, 2, 5, 7, 8, 0, 3, 6, 4, 9][4, 9][1, 2, 5, 7, 8, 0, 3, 6, 4, 9][0, 3, 6, 4, 9][1, 2, 5, 7, 8, 0, 3, 4, 6, 9][1, 2, 5, 7, 8, 0, 3, 4, 6, 9][0, 1, 2, 3, 4, 5, 6, 7, 8, 9][0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

时间复杂度:

每层为n,有log(n)层,故时间复杂度为: O(nlog(n))

转载地址:http://wbiwi.baihongyu.com/

你可能感兴趣的文章
亚马逊专家课 | 数据体系+用户画像+商品画像系列课(立省 299 元)
查看>>
直播预告丨聚焦银行数字化运营体系搭建,助力银行构建核心竞争力
查看>>
直播预告丨搭建高质量用户数据平台,加速车企数字化转型
查看>>
中原证券携手神策数据,筑就线上线下融合的数字化运营体系
查看>>
喜报!「神策 SA 分析师认证」第三期认证名单正式公布
查看>>
Two Sum(Java实现)
查看>>
动态规划之Unique Paths(java实现)
查看>>
LeetCode 64最小路径和(Java实现)
查看>>
随机产生20个[0,100]之间的整数,按升序存入一个新数组中(java代码)
查看>>
利用随机函数生成一个包含2位正整数的5*5矩阵,找出其中的最大数,最小数及位置(java代码)
查看>>
求出2/1+3/2+5/3+8/5+13/8...序列的前20项之和(Java代码)
查看>>
求1!+2!+3!....+20!(java代码)
查看>>
VMware安装Ubuntu系统无法选择语言
查看>>
QT5.12安装
查看>>
Git/Github初步使用记录
查看>>
QT 开发问题合集
查看>>
Github使用问题合集
查看>>
QT多线程服务器
查看>>
Ubuntu 18.04.2 ulimit配置
查看>>
Ubuntu Mysql 安装与配置
查看>>