简单排序算法
Created: March 9, 2022 10:53 AM
Introduction: 介绍什么是排序,以及简单的排序算法,像冒泡,选择,插入排序这些
Source: 原创
Tags: 算法专栏
列表排序
-
排序:将一组“无序”的记录序列调整为“有序”的记录序列
-
列表排序:将无序列表变为有序列表
- 输入:列表
- 输出:有序列表
-
升序与降序
- 升序就是小的在前面,大的在后面
- 降序就是大的在前面,小的在后面
-
Python内置排序函数:sort()
-
排序Low B三人组
- 冒泡排序
- 选择排序
- 插入排序
-
排序NB三人组
- 快速排序
- 堆排序
- 归并排序
-
其他排序
- 希尔排序
- 计数排序
- 基数排序
冒泡排序(Bubble Sort)
- 列表每两个相邻的数,如果前面比后面大,则交换这两个数。
- 一趟排序完成后,则无序区减少一个数,有序区增加一个数。
- 代码关键点:趟、无序区范围
- 时间复杂度: O ( n 2 ) O(n^2) O(n2)
def bubble_sort(li):
for i in range(len(li)-1): # 第i趟
for j in range(len(li)-1-i): # 无序区域
if li[j] > li[j+1]:
li[j], li[j+1] = li[j+1], li[j]
冒泡排序 - 优化
- 如果冒泡排序中的一趟排序没有发生交换,则说明列表已经有序,可以直接结束算法。
def bubble_sort(li):
for i in range(len(li)-1): # 第i趟
exchange = False # 添加是否改变标志位
for j in range(len(li)-1-i): # 无序区域
if li[j] > li[j+1]:
li[j], li[j+1] = li[j+1], li[j]
exchange = True # 每趟如果有变动则改变标志位为True
if not exchange: # 如果这趟没有变动,则改变标志位为False,即没有变化,列表为有序,直接返回
return
选择排序(Select Sort)
- 一趟排序记录最小的数,放到第一个位置
- 再一趟排序记录列表无序区最小的数,放到第二个位置
- …
- 算法的关键点:有序区和无序区、无序区最小数的weizh
def select_sort_simple(li):
li_new = [] # 新建一个列表
for i in range(len(li)):
min_val = min(li) # 取最小值
li_new.append(min_val) # 将最小值加入新列表中
li.remove(min_val) # 在原先列表删除该值
return li_new # 返回新列表,即排好序的列表
大家看一下上面这个选择排序好不好?
答案是:不推荐!!!
首先,新建了一个列表,开辟了一个空间,多用了空间,再者,min()函数的时间复杂度是 O ( n ) O(n) O(n),remove方法的时间复杂度也是 O ( n ) O(n) O(n),外面再套一个循环,所以整个的时间复杂度为 O ( n 2 ) O(n^2) O(n2)
选择排序 - 标准
def select_sort(li):
for i in range(len(li)-1): # 第i趟
min_loc = i # 记录最小值的位置
for j in range(i,len(li)):
if li[min_loc] > li[j]:
min_loc = j # 遍历查找后面最小的值并赋值
if min_loc != i:
li[i], li[min_loc] = li[min_loc], li[i] # 交换
插入排序
- 初始时手里(有序区)只有一张牌。
- 每次(从无序区)摸一张牌,插入到手里已有牌(有序区)的正确位置。
- 时间复杂度: O ( n 2 ) O(n^2) O(n2)
def insert_sort(li):
for i in range(1,len(li)): # 第i次摸牌,i表示摸到的牌的下标
tmp = li[i] # 用临时变量储存摸到的牌
j = i - 1 # j指的是手里的牌
while j >= 0 and li[j] > tmp: # 寻找插入位置:如果j >= 0的情况下(对比有序区),出现有比摸到的牌大的牌就往右移动
li[j+1] = li[j] # 将j+1空间里存放j空间的值,其实就是把牌往右移
j -= 1 # j-1继续对有序区的其他牌继续进行判断直到牌比摸到的牌小为止
li[j+1] = tmp # 将牌插入当前位置
相关参考
清华大学博士讲解Python数据结构与算法:https://www.bilibili.com/video/BV1uA411N7c5?p=11