Python冒泡排序及优化、选择排序、插入排序及优化
1. 冒泡排序
def bubble_sort(alist):
'''冒泡排序'''
for i in range(len(alist)-1, 0, -1): # i表示每次遍历需要比较的次数,逐渐减小
for j in range(i):
if alist[j] > alist[j + 1]:
alist[j], alist[j + 1] = alist[j + 1], alist[j]
alist = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
bubble_sort(alist)
print(alist)
[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]
-
冒泡排序优化
def bubble_sort2(alist): '''冒泡排序优化''' for i in range(len(alist)-1, 0, -1): count = 0 # 记录交换次数 for j in range(i): if alist[j] > alist[j + 1]: alist[j], alist[j + 1] = alist[j + 1], alist[j] count += 1 if count == 0: # 若某次遍历中无交换,则不用再比较 return alist2 = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48] bubble_sort2(alist2) print(alist2)
[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]
2. 选择排序
def selection_sort(alist):
'''选择排序'''
n = len(alist)
for i in range(n-1): # n-1次选择操作
min_index = i # 最小值位置
for j in range(i + 1, n): # 从i+1位置到末尾选择出最小数字
for j in range(i + 1, n):
if alist[j] < alist[min_index]:
min_index = j
if min_index != i: # 若选择出的数字不在正确位置,则进行交换
alist[i], alist[min_index] = alist[min_index], alist[i]
alist = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
selection_sort(alist)
print(alist)
[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]
3. 插入排序
def insert_sort(alist):
'''插入排序'''
for i in range(1, len(alist)): # 从第2个位置,即下标为1的元素开始向前插入
for j in range(i, 0, -1): # 从第i个元素开始向前比较,若小于前一个元素,则交换位置(向前插一位)
if alist[j] < alist[j - 1]:
alist[j], alist[j - 1] = alist[j - 1], alist[j]
alist = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
insert_sort(alist)
print(alist)
[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]
-
插入排序优化
def insert_sort2(alist): '''插入排序优化''' for i in range(1, len(alist)): for j in range(i, 0, -1): if alist[j] < alist[j - 1]: alist[j], alist[j - 1] = alist[j - 1], alist[j] else: # 当前数字大于等于前一个数字,则不再进行比较 break alist2 = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48] insert_sort(alist2) print(alist2)
[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]
总结:
类别 | 最优时间复杂度 | 最坏时间复杂度 | 平均时间复杂度 | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
冒泡排序 | O ( n ) O(n) O(n) | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | 稳定 |
选择排序 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | 不稳定 |
插入排序 | O ( n ) O(n) O(n) | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | 稳定 |
图片来源于: