一、插入排序

1.1 思想

  1. 初始时手里(有序区)只有一张牌
  2. 每次(从无序区)摸一张牌,若摸到的牌比手里有序区最大下标(最右边的牌)所对应的牌大,则手里的牌 右移,继续比较前一个元素与摸到牌得大小,直到找到比它小或等于它的元素插入在其后。

1.2 案例

# -*- coding: utf-8 -*-
# @Time     : 2021/11/27 9:07
# @Author   : wljess
# @File     : 插入排序.py
# @Describe :
# @Software : PyCharmdef insert_sort(li):'''插入排序:param li: 待排序的列表:return:'''for i in range(1, len(li)):  # i代表摸到无序区牌的下标tmp = li[i]  # 每次从无序区摸到的牌存到临时变量中j = i - 1  # 代表手里的牌# 当手中的牌比摸到的牌大,手里牌向右移动,为防止索引越界,所以j >= 0while j >= 0 and li[j] > tmp:  # 找到插入摸到牌的位置# 手里牌向右移动,即将j位置的牌放赋值给j + 1的位置li[j + 1] = li[j]# j -= 1(继续比较j前一个位置与摸到牌的大小)j -= 1# 循环完之后将摸到的牌放到待插入的位置li[j + 1] = tmp#print(f"第{i}躺排序:{li}")return liif __name__ == '__main__':lst = [92, 18, 45, 36, 9, 8, 7, 19, 9, 20, 35]print(insert_sort(lst))

1.3 总结

插入排序的适用场景:一个新元素需要插入到一组已经是有序的数组中,或者是一组基本有序的数组排序

  • 比较性:排序时元素之间需要比较,所以为比较排序

  • 稳定性:从代码我们可以看出只有比较元素大于当前元素,比较元素才会往后移动,所以相同元素是不会改变相对顺序

  • 时间复杂度:插入排序同样需要两次循坏一个一个比较,故时间复杂度也为O(n^2)

  • 空间复杂度:只需要常数个辅助单元,所以空间复杂度也为O(1)

  • 记忆方法:想象成在书架中插书:先找到相应位置,将后面的书往后推,再将书插入

二、选择排序

2.1 思想

  1. 一趟排序记录最小的数,放到第一个位置
  2. 再一趟排序记录列表无序区最小的位置,放到第二个位置
  3. 重复步骤2,直到所有元素都拍好序

算法关键:有序区和无序区、无序区最小数的位置

注:一轮比较完后,找出最小的,再交换这个元素和对应轮数位置处的元素位置,每轮只交换一次

2.2 案例

# -*- coding: utf-8 -*-
# @Time     : 2021/11/27 9:07
# @Author   : wljess
# @File     : 选择排序.py
# @Describe :
# @Software : PyCharmdef select_sort(li):'''选择排序:param li: 待排序列表:return:'''for i in range(len(li) - 1):  # 循环n躺min_loc = i  # 假设最小元素下标为每趟循环的i值for j in range(i + 1, len(li)):  # 每躺循环找到最小元素下标if li[j] <= li[min_loc]:  # 若无序区元素小于记录的最小元素下标,更新最小元素下标min_loc = j# 每趟循环结束,交换i和最小元素min_loc位置li[i], li[min_loc] = li[min_loc], li[i]print(li)return liif __name__ == '__main__':lst = [92, 18, 45, 36, 9, 8, 7, 19, 20, 35]print(select_sort(lst))

2.3 总结

选择排序冒泡排序很类似,但是选择排序每轮比较只会有一次交换,而冒泡排序会有多次交换,交换次数比冒泡排序少,就减少cpu的消耗,所以在数据量小的时候可以用选择排序,实际适用的场合非常少

  1. 比较性:因为排序时元素之间需要比较,所以是比较排序
  2. 稳定性:因为存在任意位置的两个元素交换,比如[5, 8, 5, 2],第一个5会和2交换位置,所以改变了两个5原来的相对顺序,所以为不稳定排序
  3. 时间复杂度:我们看到选择排序同样是双层循环n*(n-1)),所以时间复杂度也为:O(n^2)
  4. 空间复杂度:只需要常数个辅助单元,所以空间复杂度也为O(1)

三、冒泡排序

3.1 思想

  1. 列表每两个相邻的数,如果前面比后面大,则交换这两个数
  2. 一趟排序完成后,则无序区减少一个数,有序区增加一个数

3.2 案例

# -*- coding: utf-8 -*-
# @Time     : 2021/11/27 9:07
# @Author   : wljess
# @File     : 冒泡排序.py
# @Describe :
# @Software : PyCharmdef bulled_sort(li):'''冒泡排序:param li: 待排序列表:return:'''for i in range(len(li) - 1):  # 循环n躺for j in range(len(li) - i - 1):  # 每趟找到最大元素if li[j] > li[j + 1]:li[j], li[j+1] = li[j+1], li[j]return liif __name__ == '__main__':lst = [92, 18, 45, 36, 9, 8, 7, 19, 20, 35, 102, 36]print(bulled_sort(lst))
# -*- coding: utf-8 -*-
# @Time     : 2021/11/27 11:36
# @Author   : wljess
# @File     : 优化后的冒泡排序.py
# @Describe : 优化后的冒泡排序
# @Software : PyCharmdef bulled_sort(li):'''冒泡排序:param li: 待排序列表:return:'''for i in range(len(li) - 1):  # 循环n躺exchange = Falsefor j in range(len(li) - i - 1):  # 每趟找到最大元素if li[j] > li[j + 1]:li[j], li[j+1] = li[j+1], li[j]exchange = Trueif not exchange:breakprint(f"第{i}躺:{li}")return liif __name__ == '__main__':lst = [92, 18, 45, 36, 9, 8, 7, 1, 2, 3, 4, 5, 6]print(bulled_sort(lst))

3.3 总结

​ 冒泡排序是一种简单直接暴力的排序算法,因为每一轮比较可能多个元素移动位置,而元素位置的互换是需要消耗资源的,所以这是一种偏慢的排序算法,仅适用于对于含有较少元素的数列进行排序。

  • 稳定性:我们从代码中可以看出只有前一个元素大于后一个元素才可能交换位置,所以相同元素的相对顺序不可能改变,所以它是稳定排序

  • 比较性:因为排序时元素之间需要比较,所以是比较排序

  • 时间复杂度:因为它需要双层循环n*(n-1)),所以平均时间复杂度为O(n^2)

  • 空间复杂度:只需要常数个辅助单元,所以空间复杂度为O(1),我们把空间复杂度为O(1)的排序称为原地排序(in-place)

  • 记忆方法:想象成气泡,一层一层的往上变大

排序算法中的LowB三人组相关推荐

  1. 排序算法之low B三人组

    排序算法之low B三人组 排序low B三人组 列表排序:将无序列表变成有充列表 应用场景:各种榜单,各种表格,给二分法排序使用,给其他算法使用 输入无序列表,输出有序列表(升序或降序) 排序low ...

  2. 算法1-排序LowB三人组

    import random from timewrap import *@cal_time def bubble_sort(li):for i in range(len(li) - 1):# i 表示 ...

  3. 排序算法lowb三人组-插入排序

    排序算法lowb三人组-插入排序 def insert_sort(li):for i in range(1, len(li)): # i表示摸到的牌的下标tmp = li[i] # 摸到的牌j = i ...

  4. 排序算法中平均时间复杂度_操作系统中的作业排序(算法,时间复杂度和示例)...

    排序算法中平均时间复杂度 作业排序 (Job sequencing) Job sequencing is the set of jobs, associated with the job i wher ...

  5. 分治法在排序算法中的应用(JAVA)--快速排序(Lomuto划分、Hoare划分、随机化快排)

    分治法在排序算法中的应用--快速排序 时间复杂度:平均O(nlogn),最坏O(n^2) 如果说归并排序是按照元素在数组中的位置划分的话,那么快速排序就是按照元素的值进行划分.划分方法由两种,本节将主 ...

  6. 在遗传算法中出现等式约束_排序算法中的稳定性-等式的处理

    在遗传算法中出现等式约束 by Onel Harrison 通过Onel Harrison 排序算法中的稳定性-等式的处理 (Stability in Sorting Algorithms - A T ...

  7. 蛮力法在排序算法中的应用(JAVA)--选择排序、冒泡排序

    蛮力法在排序算法中的应用 对于一个排序问题,我们能想到的最简单的排序方法就是选择和冒泡 1.选择排序:时间复杂度O(n^2) public class Main {public static void ...

  8. 减治法在排序算法中的应用(JAVA)--插入排序

    一.减治法在排序算法中的应用 插入排序:时间复杂度O(n^2),虽然和选择.冒泡在最坏的情况下时间复杂度相同,但是插排平均性能在比自身的最差性能快一倍,所以相比选择.冒泡来说,插排要领先于二者. pu ...

  9. 排序算法中——归并排序和快速排序

    冒泡排序.插入排序.选择排序这三种算法的时间复杂度都为 $O(n^2)$,只适合小规模的数据.今天,我们来认识两种时间复杂度为 $O(nlogn)$ 的排序算法--归并排序(Merge Sort)和快 ...

  10. ICITR 2021 | 排序算法中的用户公平性、item公平性和多样性

    ©PaperWeekly 原创 · 作者 | 金金 单位 | 阿里巴巴研究实习生 研究方向 | 推荐系统 简介 根据相关性概率对项目进行排序一直是传统排序系统的目标.虽然这最大化了传统的排名标准,但人 ...

最新文章

  1. SAP RETAIL WB02 为门店激活物料分类账报错 - Distribution chain NMI1 00 not valid for retail price determination -
  2. python turtle库画图案-Python如何使用turtle库绘制图形
  3. QT mouseMoveEvent事件(qmainwindow内追踪鼠标事件事件)
  4. MySQL学习笔记02【SQL基本概念与通用语法、数据库的CRUD操作】
  5. loadrunner controller:实时查看VUser的运行情况
  6. 基于fpga的dds函数信号发生器的设计_超声信号功率放大器驱动压电陶瓷测试
  7. 文献检索的正确姿势——新生培训
  8. python实现神经网络_3. Python矢量化实现神经网络
  9. 信号的概念以及网络布线
  10. 三菱modbusRTU通讯实例_编程实例 | 台达PLC控制伺服项目接线及程序案例
  11. rfid水洗电子标签怎么管理洗涤衣物
  12. C++通信录管理系统
  13. php读取json三级,php-流明从文件中读取JSON
  14. webuploader上传文件夹总结
  15. 游戏策划入门(5)——开始绘制系统的结构流程图
  16. ehshig蒙文歌曲_ehshig蒙文歌曲下载
  17. 《程序员练习生》第7期 珍爱生命远离编程
  18. 我,阿里的程序员,工作5年,揭露阿里员工的真实收入和工作经历
  19. C语言 输入月份,输出该月有多少天(假设不考虑闰年的情况下)。
  20. 操作系统(OS)内核

热门文章

  1. 如何成为数据科学家_成为数据科学家
  2. 微信分享链接,图片不显示
  3. 从一个路由器里面接出一条网线,连接到另一个路由器
  4. spboot开发的jar包开机自启
  5. win10系统跟Linux系统哪个好,Linux比Windows10系统好吗?Linux vs Win10测试
  6. html 置换元素和非置换元素
  7. 红米手机android在哪里,红米手机usb调试在哪【图文】
  8. 用计算机处理表格信息,用计算机处理数据
  9. 美国服务器电影网站版权问题,为什么说选择美国服务器做电影网站比较好
  10. 如何利用PowerShell完成的Windows服务器系统安全加固实践和基线检测