算法之排序之一
1. 排序
将一组无序的记录序列调整为有序的记录序列
输入无序列表,输出有序列表
常见算法:冒泡,选择,插入,快速,堆,归并,希尔,计数,基数
2. 冒泡排序
列表每相邻的数,如果前面比后面大,则交换这两个数
遍历一次列表后,无序区减少一个数,有序区增加一个数,一共遍历n-1遍
时间复杂度:O(n2)
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
if not exchange:
return
3. 选择排序
遍历无序区,找到最小的一个数,与无序区第一个数交换,遍历n-1遍
时间复杂度:O(n2)
def select_sort(li):
for i in range(len(li) - 1): # i是第几趟
min_loc = i
for j in range(i + 1, len(li)): # 遍历无序区
if li[j] < li[min_loc]:
min_loc = j
li[i], li[min_loc] = li[min_loc], li[i]
4. 插入排序
类似摸牌
无序区最左边的一个数跟有序区的最右边比较,有序区的大,这个数就往右边移动,再跟有序区右边第二个数比较
时间复杂度:O(n2)
def insert_sort(li):
for i in range(1, len(li)): # i表示摸到的牌的下标,手上一张,从第二张开始
tmp = li[i]
j = i - 1 # j指的是手里最右边的牌的下标,开始是第一张
while li[j] > tmp and j >= 0: # 手上牌最大的那张比摸到的大
li[j + 1] = li[j] # 手上牌往右挪一位
j -= 1 # 指针往左走
li[j + 1] = tmp # 把摸到的牌插入