大佬教程收集整理的这篇文章主要介绍了python每日算法 | 图文挑战十大排序算法DAY1,再也不用担心面试官问冒泡、选择、插入排序!持续更新,收藏起来❤,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
创作不易c;来了的客官点点关注c;收藏c;订阅一键三连❤ὡc;
程序=数据结构+算法c;算法是数学理论和工程实现的杂糅c;是一个十分有趣神奇的学问。搞懂算法用另一种视角看编程c;又会是一种全新的感受c;如果你也在学习算法c;不妨跟主任萌新超差一起学习c;拿下算法!
python每日算法|实现四大查找算法c;生动形象c;保证一看就会!
python每日算法——算法的起步与递归算法(汉诺塔问题)
本期的内容将介绍十大排序算法之冒泡排序、选择排序以及插入排序c;通过本期内容你不仅能知道他们的代码如何用python实现c;还将学会用装饰器来查看算法的运行时间等等!再也不用担心面试官问冒泡、选择、插入排序!
前言
系列文章目录
概述
超超python算法学习思维导图
排序
排序是什么
列表排序
常见的排序算法
冒泡排序
什么是冒泡排序
代码讲解
代码优化
选择排序
什么是选择排序
代码讲解
优化后的选择排序代码
插入排序
什么是插入排序?
代码讲解
冒泡排序、选择排序、插入排序小总结
思考:三种算法效率如何体现
思维导图将每日更新c;欢迎大家订阅超超的python每日算法专栏
排序:将一组“无序”的记录序列调整为“有序”的记录序列
列表排序:将无序列表变为有序列表
输入:列表
输出:有序列表
顺序的类型:升序(从小到大)与降序(从大到小)
内置排序函数:sort()
排序基础三人组:冒泡排序 选择排序 插入排序
排序进阶三人组:快速排序 堆排序 归并排序
其他排序算法:希尔排序 计数排序 基数排序 桶排序
(可能归纳不全c;但保证管用)
冒泡排序(Bubble Sort)是一种简单直观的排序算法。它重复地走访要排序的数列c;依次比较两个元素c;如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换c;也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。
简单来说c;列表每两个相邻的数c;如果前面的比后面的大则交换这两个数c;一趟排序完成后c;则无序区减少一个数c;有序区增加一个数。(每一趟冒出一个无序区最大的数--->冒泡排序)
图片来自菜鸟教程
# 冒泡排序初级代码
import random
def bubble_sort(lst):
for i in range(len(lst) - 1): # 表示第i趟,此处也可以直接用len(lst),但是直接用len(lst)会多走了最后一遍
@R_673_5179@ for j in range(len(lst)-i-1): # 表示箭头(下标)可移动的无序区范围c;比如长为10的列表c;i取值则是0-9c;第二次查找则无序区的长度为10-i(此时是1c;第一次是0)-1(-1因为是根据下标查找)=8c;因此箭头范围0-8
@R_673_5179@ if lst[j] > lst[j+1]: # 此时是升序排序c;>改为<则改为了降序
@R_673_5179@@R_673_5179@ lst[j],lst[j+1] = lst[j+1],lst[j]
@R_673_5179@ print(f"第{i+1}趟后的列表为:{lst}") # 查看排序过程
lst1 = [random.randint(0,10000) for i in range(5)]
print(f"初始列表:{lst1}")
bubble_sort(lst1)
# 结果
# 初始列表:[3053, 8957, 2153, 4502, 2518]
# 第1趟后的列表为:[3053, 2153, 4502, 2518, 8957]
# 第2趟后的列表为:[2153, 3053, 2518, 4502, 8957]
# 第3趟后的列表为:[2153, 2518, 3053, 4502, 8957]
# 第4趟后的列表为:[2153, 2518, 3053, 4502, 8957]
lst2 = [1,2,3,8,7,6,5]
print(f"初始列表:{lst2}")
bubble_sort(lst2)
# 初始列表:[1, 2, 3, 8, 7, 6, 5]
# 第1趟后的列表为:[1, 2, 3, 7, 6, 5, 8]
# 第2趟后的列表为:[1, 2, 3, 6, 5, 7, 8]
# 第3趟后的列表为:[1, 2, 3, 5, 6, 7, 8]
# 第4趟后的列表为:[1, 2, 3, 5, 6, 7, 8]
# 第5趟后的列表为:[1, 2, 3, 5, 6, 7, 8]
# 第6趟后的列表为:[1, 2, 3, 5, 6, 7, 8]
此时我们发现冒泡排序多走路了一趟c;第3趟和第6趟一样c;且第3趟已排好c;那么如何对代码进行改进?
# 改进后的代码
def bubble_sort(lst):
for i in range(len(lst) - 1): # 表示第i趟
@R_673_5179@ exchange = false # 每一趟做标记
@R_673_5179@ for j in range(len(lst)-i-1): # 表示箭头
@R_673_5179@ if lst[j] > lst[j+1]: # 此时是升序排序c;>改为<则改为了降序
@R_673_5179@@R_673_5179@ lst[j],lst[j+1] = lst[j+1],lst[j]
@R_673_5179@@R_673_5179@ exchange = True # 进行了交换c;exchange标记为Ture
@R_673_5179@ print(f"第{i+1}趟后的列表为:{lst}") # 查看排序过程
@R_673_5179@ if not exchange: # 如果没有进行交换c;直接返回c;优化的步骤
@R_673_5179@ return
lst2 = [1,2,3,8,7,6,5]
print("***改进后的冒泡排序***")
print(f"初始列表:{lst2}")
bubble_sort(lst2)
# 结果
# ***改进后的冒泡排序***
# 初始列表:[1, 2, 3, 8, 7, 6, 5]
# 第1趟后的列表为:[1, 2, 3, 7, 6, 5, 8]
# 第2趟后的列表为:[1, 2, 3, 6, 5, 7, 8]
# 第3趟后的列表为:[1, 2, 3, 5, 6, 7, 8]
# 第4趟后的列表为:[1, 2, 3, 5, 6, 7, 8]
冒泡算法的时间复杂度:O(n2)c;两层查找。
选择排序(SELEction sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素c;存放到排序序列的起始位置c;然后c;再从剩余未排序元素中继续寻找最小(大)元素c;然后放到已排序序列的末尾。以此类推c;直到所有元素均排序完毕。
简单来说c;选择排序就是每一趟排序记录最小的数c;并放到第一个位置c;在一趟排序记录列表中无序区最小的数c;放到有序区第二个位置…….以此循环c;直到只剩最后一个数时c;此数绝对是最大的数。
此算法的关键点时:有序区和无序区以及无序区最小数的位置。
图片来自菜鸟教程
简单易理解的选择排序
def SELEct_sort_simple(lst):
new_lst = []
for i in range(len(lst)):
@R_673_5179@ min_val = min(lst)
@R_673_5179@ new_lst.append(min_val)
@R_673_5179@ lst.remove(min_val)
return new_lst
lst1 = [3,2,4,13,11,8]
result = SELEct_sort_simple(lst1)
print(result)
# 结果
# [2, 3, 4, 8, 11, 13]
1.建立新的列表占用了内存
2.时间复杂度较大c;O(n^2)
接下来我们对列表进行优化
def SELEct_sort(lst):
for i in range(len(lst) - 1): # i代表第几趟
@R_673_5179@ min_LOCATIOn = i # 最小位置的标记c;第一次默认最小的数为无序区的第一个c;即下标为i
@R_673_5179@ for j in range(i+1,len(lst)): # 从i开始相当于自己和自己比了一次c;此步骤多余c;因此从i+1开始
@R_673_5179@ if lst[j] < lst[min_LOCATIOn]:
@R_673_5179@@R_673_5179@ min_LOCATIOn = j
@R_673_5179@ lst[i],lst[min_LOCATIOn] = lst[min_LOCATIOn],lst[i] # 最小的值和有序区的最后一个值进行交换
@R_673_5179@ print(f"第{i + 1}趟后的列表为:{lst}")
lst1 = [3,2,4,13,11,8]
SELEct_sort(lst1)
# 结果
# 第1趟后的列表为:[2, 3, 4, 13, 11, 8]
# 第2趟后的列表为:[2, 3, 4, 13, 11, 8]
# 第3趟后的列表为:[2, 3, 4, 13, 11, 8]
# 第4趟后的列表为:[2, 3, 4, 8, 11, 13]
# 第5趟后的列表为:[2, 3, 4, 8, 11, 13]
选择排序的时间复杂度:O(n2)(两层循环)
先举个生活实例
假设c;你的手上有一副排好顺序的牌(有序区)c;此时你需要从还没摸完的牌(无序区)里摸一张牌c;插入到已有牌的手里c;直到摸完牌(从无序去)c;最后手上的牌(有序区)也排好序了。
插入排序(英语:Insertion Sort)的工作原理是通过构建有序序列c;对于未排序数据c;在已排序序列中从后向前扫描c;找到相应位置并插入。
图片来自菜鸟教程
def insert_sort(lst):
for i in range(1,len(lst)): # i表示摸到的牌的下标
@R_673_5179@ tmp = lst[i] # tmp代表摸到的牌
@R_673_5179@ j = i - 1 # j代表的是手里的牌的下标c;手上自动已有第一张牌
@R_673_5179@ while lst[j] > tmp and j >= 0: # 需要移动有序区牌的情况
@R_673_5179@ lst[j+1] = lst[j]
@R_673_5179@ j -= 1
@R_673_5179@ lst[j+1] = tmp # lst[j+1]是用来存放要插入的牌
@R_673_5179@ print(f"第{i}趟的列表:{lst}")
lst1 = [3,2,5,8,6,9,7]
print(f"原列表{lst1}")
insert_sort(lst1)
# 结果原列表[3, 2, 5, 8, 6, 9, 7]
# 第1趟的列表:[2, 3, 5, 8, 6, 9, 7]
# 第2趟的列表:[2, 3, 5, 8, 6, 9, 7]
# 第3趟的列表:[2, 3, 5, 8, 6, 9, 7]
# 第4趟的列表:[2, 3, 5, 6, 8, 9, 7]
# 第5趟的列表:[2, 3, 5, 6, 8, 9, 7]
# 第6趟的列表:[2, 3, 5, 6, 7, 8, 9]
插入排序时间复杂度:O(n2)
1.三种排序方法的时间复杂度都是O(n2)
2.三种算法都属于原地排序c;为创建新的列表
3.效率较低
现在利用装饰器c;以冒泡排序为例子计算一下运算时间
from runtime import *
@runtime
def bubble_sort(lst):
for i in range(len(lst) - 1): # 表示第i趟
@R_673_5179@ exchange = false # 每一趟做标记
@R_673_5179@ for j in range(len(lst)-i-1): # 表示箭头
@R_673_5179@ if lst[j] > lst[j+1]: # 此时是升序排序c;>改为<则改为了降序
@R_673_5179@@R_673_5179@ lst[j],lst[j+1] = lst[j+1],lst[j]
@R_673_5179@@R_673_5179@ exchange = True # 进行了交换c;exchange标记为Ture
@R_673_5179@ # print(f"第{i+1}趟后的列表为:{lst}") # 查看排序过程
@R_673_5179@ if not exchange: # 如果没有进行交换c;直接返回c;优化的步骤
@R_673_5179@ return
lst = list(range(10000))
random.shuffle(lst)
bubble_sort(lst)
# 结果
# bubble_sort执行用时12.76702880859375s
我们发现当列表长度比较长时c;冒泡排序需要的时间很长(相对于机器的运算)
那么是否有时间复杂度更低的排序算法呢?
以上是大佬教程为你收集整理的python每日算法 | 图文挑战十大排序算法DAY1,再也不用担心面试官问冒泡、选择、插入排序!持续更新,收藏起来❤全部内容,希望文章能够帮你解决python每日算法 | 图文挑战十大排序算法DAY1,再也不用担心面试官问冒泡、选择、插入排序!持续更新,收藏起来❤所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。