1.冒泡排序

思路:遍历列表,每一轮每次比较相邻两项,将无序的两项交换,下一轮遍历比前一轮比较次数减1。

  1. def bubble_sort(a_list):
  2. for passnum in range(len(a_list)-1, 0, -1):
  3. for i in range(passnum):
  4. if a_list[i] > a_list[i+1]:
  5. a_list[i], a_list[i+1] = a_list[i+1], a_list[i]

改进:遍历期间没有交换,则认为已排序,可以停止。

  1. def short_bubble_sort(a_list):
  2. exchanges = True
  3. passnum = len(a_list) - 1
  4. while passnum > 0 and exchanges:
  5. exchanges = False
  6. for i in range(passnum):
  7. if a_list[i] > a_list[i+1]:
  8. exchanges = True
  9. a_list[i], a_list[i+1] = a_list[i+1], a_list[i]
  10. passnum = passnum - 1

动画演示:

2.选择排序

思路:遍历列表,每次遍历选出最大的放在合适的位置。

  1. def selection_sort(a_list):
  2. for fillslot in range(len(a_list)-1, 0, -1):
  3. position_max=0
  4. for location in range(1, fillslot+1):
  5. if a_list[location] > a_list[position_max]:
  6. position_max = location
  7. a_list[fillslot], a_list[position_max] = a_list[position_max], a_list[fillslot]

动画演示:

3.插入排序

思路:每一步都将待插入的数据按大小插入到已排序的数据中的合适位置。

  1. def insertion_sort(a_list):
  2. for index in range(1, len(a_list)):
  3. cur_value = a_list[index]
  4. pos = index
  5. while pos > 0 and a_list[pos-1] > cur_value:
  6. a_list[pos] = a_list[pos-1]
  7. pos = pos - 1
  8. a_list[pos] = cur_value

动画演示:

4.希尔排序

思路:分解为多个子列表进行插入排序,不是连续分,而是通过增量。

  1. def shell_sort(a_list):
  2. sublist_count = len(a_list)
  3. while sublist_count > 0:
  4. for start_position in range(sublist_count):
  5. gap_insertion_sort(a_list, start_position, sublist_count)
  6. sublistcount = sublistcount // 2
  7. def gap_insertion_sort(a_list, start, gap):
  8. for i in range(start+gap, len(a_list), gap):
  9. current_value = a_list[i]
  10. position = i
  11. while position >= gap and a_list[position-gap] > current_value:
  12. a_list[position] = a_list[position-gap]
  13. position = position - gap
  14. a_list[position] = current_value

5.归并排序

思路:分而治之,不断拆分为一半,直至项数为0或1,然后排序合并。需要额外空间。

  1. def merge_sort(a_list):
  2. if len(a_list) > 1:
  3. mid = len(a_list) // 2
  4. lefthalf = a_list[:mid]
  5. righthalf = a_list[mid:]
  6. merge_sort(lefthalf)
  7. merge_sort(righthalf)
  8. i=0
  9. j=0
  10. k=0
  11. while i < len(lefthalf) and j < len(righthalf):
  12. if lefthalf[i] < righthalf[j]:
  13. a_list[k] = lefthalf[i]
  14. i = i + 1
  15. else:
  16. a_list[k] = righthalf[j]
  17. j = j + 1
  18. k=k+1
  19. while i < len(lefthalf):
  20. a_list[k] = lefthalf[i]
  21. i = i + 1
  22. k = k + 1
  23. while j < len(righthalf):
  24. a_list[k] = righthalf[j]
  25. j = j + 1
  26. k = k + 1

动画演示:

6.快速排序

思路:与归并一样使用分而治之,不使用额外内存,特点是枢轴值。

  1. def quick_sort(a_list):
  2. quick_sort_helper(a_list, 0, len(a_list)-1)
  3. def quick_sort_helper(a_list, first, last):
  4. if first < last:
  5. splitpoint = partition(a_list, first, last)
  6. quick_sort_helper(a_list, first, splitpoint-1)
  7. quick_sort_helper(a_list, splitpoint+1, last)
  8. def partition(a_list, first, last):
  9. pivotvalue = a_list[first]
  10. leftmark = first + 1
  11. rightmark = last
  12. done = False
  13. while not done:
  14. while leftmark <= rightmark and a_list[leftmark] <= pivotvalue:
  15. leftmark = leftmark + 1
  16. while a_list[rightmark] >= pivotvalue and rightmark >= leftmark:
  17. rightmark = rightmark -1
  18. if rightmark < leftmark:
  19. done = True
  20. else:
  21. a_list[leftmark], a_list[rightmark] = a_list[rightmark], a_list[leftmark]
  22. a_list[first], a_list[rightmark] = a_list[rightmark], a_list[first]

动画演示:

说明:

1.参考https://interactivepython.org/runestone/static/pythonds/SortSearch/toctree.html

2.动画来自https://visualgo.net/en 截图

排序算法 - 6种 - 超炫的动画演示 - Python实现相关推荐

  1. 排序算法详解(Java实现 + 动画演示)

    目录 引言 一.排序算法概述 排序的定义 术语说明 排序算法分类及对比 比较排序和非比较排序的区别 二.十大经典排序算法 1.直接选择排序 2.堆排序 3.直接插入排序 4.希尔排序 5.冒泡排序 6 ...

  2. 面试必考排序算法最详细介绍,包含动画演示、大厂真题(每天一遍,面试必过)

    文章目录 前言 六大排序算法 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 总结 一图解释所有 关于时间复杂度 关于稳定性 大厂面试真题 前言 不知道大家有没有发现,排序算法的考核在校招 ...

  3. Canvas 示例:4种超炫的网站动画背景效果

    今天,我们想分享一些动画背景的灵感.全屏背景图片的网站头部是最新的网页设计趋势,已经持续了一段时间.最近人们一直在转向动画添加更多的视觉兴趣到他们的网站中,在这里我们想向您分享几个使用  JavaSc ...

  4. 一款基jquery超炫的动画导航菜单

    今天给大家分享一款基jquery超炫的动画导航菜单.这款导航菜单,初始时页面中间一个按钮,单击按钮,菜单从左侧飞入页中.再次单击按钮,导航飞入左侧消息.动画效果很非常炫.一起看下效果图: 在线预览   ...

  5. 【经典排序算法】二分查找法 (动图演示 + C 语言代码实现)

    [经典排序算法]二分查找法 (动图演示 + C 语言代码实现)   

  6. 12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用

    0.前言 从这一部分开始直接切入我们计算机互联网笔试面试中的重头戏算法了,初始的想法是找一条主线,比如数据结构或者解题思路方法,将博主见过做过整理过的算法题逐个分析一遍(博主当年自己学算法就是用这种比 ...

  7. 9种常用排序算法总结(超详细)

    以int型数据为例,且0号下标数组用来做为交换辅助空间,数据从1号下标开始存储 一.插入排序 基本思想:每一趟将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到全部待排序 ...

  8. 常见七种排序算法对比(超全!!!)

    文章目录 一, 直接插入排序 二,希尔排序 三.选择排序 四,堆排序 五,冒泡排序 六,快速排序 如何优化快排呢? 三数取中法优化快排 七,归并排序 怎么判断是不是稳定的排序呢? 如果当前这个序列,在 ...

  9. 经典网页设计:超炫的动画效果单页网站设计

    单页网站是把所有的内容都展示在一个页面中,这样访客就不需要跳转到其它的页面.如果一个网站的内容不是很多而且将来内容也不怎么增加的情况下,那么制作成单页网站(Single Page Websites)的 ...

最新文章

  1. Java 基础------16进制转2进制
  2. Windows PE导出表编程3(暴力覆盖导出函数)
  3. Java事件处理机制和适配器
  4. ADN新开了云计算Cloud和移动计算Mobile相关技术的博客
  5. 使用Fiori elements技术开发的ui5应用,方便大家参考
  6. 单片机小白学步系列(十) 单片机程序下载相关知识
  7. 【贪心】雷达装置(ybtoj 贪心-1-2)
  8. Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate
  9. 如何写Dockerfile,Dockerfile 参考文档
  10. 免费FTP解决方案之FileZilla
  11. 设备巡检维修报备小程序开发制作功能介绍
  12. 网易前端框架--NEC
  13. root改手机型号王者,手机root后怎么改手机型号
  14. python驾到~障碍通通闪开,美女批量入内存~
  15. 自己制作Windows PE工具盘
  16. JavaScript小白实现简易悬浮层制作(含测试源码)
  17. Samba结合Windows AD
  18. 多所985大学退出国际排名,会是大势所趋吗?
  19. Ubuntu18.04人工智能环境搭建
  20. HTML中表格和表单的简单构造和样式

热门文章

  1. Oracle11gR2_ADG管理之恢复主库的truncate表实战
  2. asp.net core 拦击器制作的权限管理系统DEMO
  3. linux内核启动以及文件系统的加载过程
  4. linux-3.4.2移植到FL2440上(一)--只是基本移植
  5. 为什么不能在中断上半部休眠?
  6. 为什么Linux内核里大量使用goto,而很多书籍却不提倡使用?
  7. multi-line comment In file
  8. 8X25Q充电部分软件梳理(CP侧)
  9. 微电子科学与工程要学计算机吗,微电子科学与工程专业就业前景如何 有前途吗...
  10. 中希尔排序例题代码_【数据结构与算法】这或许是东半球分析十大排序算法最好的一篇文章...