-
排序算法(Sorting Algorithem)
将一串数据按一定顺序排列的算法。排序算法的稳定性:
稳定的排序算法会让原本键值相同元素保持原有的相对位置。不稳定的排序算法可以被人为实现为稳定,如人工扩充键值的比较,但如此会造成额外的空间负担。 -
冒泡排序(Bubble Sort)
重复遍历数列,若相邻两元素大小顺序错误,则交换位置,直至排序完成。实现方式:
#1. 冒泡排序
def bubble_sort(alist):
n = len(alist)
for i in range(n-1):
# 第一层循环:冒泡需要进行的轮数
count = 0
for j in range(n-1-i):
#第二层循环:遍历两两比较
if alist[j] > alist[j+1]:
alist[j], alist[j+1] = alist[j+1], alist[j]
count += 1
if count == 0:
#若一次遍历没有交换位置,则排序已完成,直接输出结果
return
最优时间复杂度:O(n):正好为有序序列时,只需遍历一次
最坏时间复杂度:O(n2)
稳定性:稳定
-
选择排序(Selection Sort)
重复遍历数列,每次寻找数列中的最大(小)值,与遍历起始位置值交换,直至排序完成。实现方式:
# 2. 选择排序
def selection_sort(alist):
n = len(alist)
for i in range(n-1): # 第一层循环:选择需要进行的轮数
# 首先假定循环起始元素为最小元素
min_index = i
for j in range(i+1, n):
# 如发现更小元素,更改最小索引值
if alist[j] < alist[min_index]:
min_index = j
alist[i], alist[min_index] = alist[min_index], alist[i]
最优时间复杂度:O(n2)
最坏时间复杂度:O(n2)
稳定性:不稳定:升序每次选最大值时
-
插入排序(Insertion Sort)
从数列头端开始构建有序序列,依次遍历余下元素,从后向前扫描,将它们插入到有序序列的正确位置上。实现方式:
# 3. 插入排序
def insertion_sort(alist):
n = len(alist)
for i in range(1,n): #从第二个元素开始向后遍历
while i > 0:
if alist[i-1] > alist[i]: # 将序列调整为有序序列
alist[i-1], alist[i] = alist[i], alist[i-1]
i -= 1 # 从后向前扫描
else: # 若发现无需调整,直接退出循环
break
最优时间复杂度:O(n): 正好为有序序列时,只需遍历一次
最坏时间复杂度:O(n2)
稳定性:稳定