一文看懂归并排序 python实现

红太狼 2021-05-10 11:33 828阅读 0赞

首先假设我们要排序的是这么一个序列a:

20190327215212768.png

然后首先把它在中间“劈开”,分为两段:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjgzMTk1_size_16_color_FFFFFF_t_70

其中L=0;R=len(a)-1;M=len(a)//2;

把分好的这两个序列编号 ,建立两个指针i和j,都从各自的序列的第一个元素开始。然后建立一个空的列表b:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjgzMTk1_size_16_color_FFFFFF_t_70 1

然后比较left[i]和right[j]的大小,把小的那一个加到列表b里。然后i=i+1

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjgzMTk1_size_16_color_FFFFFF_t_70 2

再比较left[i]和right[j]的大小,然后此处是right[j]大,所以right[j]放入列表b,j=j+1;

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjgzMTk1_size_16_color_FFFFFF_t_70 3

然后依次把left和right的元素加入到b中,完成排序。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjgzMTk1_size_16_color_FFFFFF_t_70 4

那么问题来了,left和right明显是排序好的分数组,如果我要排序一个杂乱无章的数组怎么办呢?

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjgzMTk1_size_16_color_FFFFFF_t_70 5

很明显。以上排序不正确。所以就应该先把left和right数组排好序后再进行整体的排序。(这个地方写错了应该是1 2 7 5 4 8 9 6 3 10)

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjgzMTk1_size_16_color_FFFFFF_t_70 6

右边的right依然是未排好序的,所以继续对right进行划分排序。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjgzMTk1_size_16_color_FFFFFF_t_70 7

这样就对右边排好序了,然后就可以进行对原数组a的left进行排序了。所以这是一个递归的过程。

就是一直把数组从中间分开,把两边进行排序,就是一个递归的的过程。

  1. def merge(a, b):
  2. c = []
  3. h = j = 0
  4. while j < len(a) and h < len(b):
  5. if a[j] < b[h]:
  6. c.append(a[j])
  7. j += 1
  8. else:
  9. c.append(b[h])
  10. h += 1
  11. if j == len(a):
  12. for i in b[h:]:
  13. c.append(i)
  14. else:
  15. for i in a[j:]:
  16. c.append(i)
  17. return c
  18. def merge_sort(lists):
  19. if len(lists) <= 1:
  20. return lists
  21. middle = len(lists)//2
  22. left = merge_sort(lists[:middle])
  23. right = merge_sort(lists[middle:])
  24. return merge(left, right)
  25. if __name__ == '__main__':
  26. a = [4, 7, 8, 3, 5, 9]
  27. print(merge_sort(a))

发表评论

表情:
评论列表 (有 0 条评论,828人围观)

还没有评论,来说两句吧...

相关阅读

    相关 网络模型

    各层 应用层 各个应用(比如:www、邮件、文件服务)使用什么协议,协议的原理,完成业务处理部分。 协议有:HTTP、HTTPS、FTP、DNS(域名服务) 等

    相关 python实现归并排序

    归并排序 “归并"是将两个或者两个以上的有序表组成一个新的有序表。假定待排序表含有n个记录,则可以看成是n个有序的子表,每个子表长度为一,然后两两归并,得到n//2个长度为

    相关 Mysql的事务

    MySQL 事务 本文所说的 MySQL 事务都是指在 InnoDB 引擎下,MyISAM 引擎是不支持事务的。 数据库事务指的是一组数据操作,事务内的操作要么就是全部