1.排序与搜索
排序算法的稳定性:不稳定排序算法可能会在相等的键值中改变纪录的相对次序,但是稳定排序算法从来不会如此。
如对以下元组按照第一个数字由小到大进行排序:
(4, 1) (3, 1) (3, 7)(5, 6)
排序结果有以下两种
(3, 1) (3, 7) (4, 1) (5, 6) (维持次序)
(3, 7) (3, 1) (4, 1) (5, 6) (次序被改变)
如果每次排序都是其中一个稳定的结果,则认为排序算法是稳定的
2.冒泡排序法
def bubble_sort(alist):
"""冒泡排序"""
n = len(alist)
for j in range(n-1):
count = 0 #进行算法的优化,如果有一个循环count为0则直接排序结束
for i in range(0, n-1-j):
#班长从头走到尾
if alist[i] > alist[i+1]:
alist[i],alist[i+1] = alist[i+1],alist[i]
count += 1
if 0 == count:
return
# i 0 ~ n-2 range(0, n-1) j=0
# i 0 ~ n-3 range(0, n-1-1) j=1
# i 0 ~ n-4 range(0, n-1-2) j=2
# for j in range(len(alist)-1,0,-1):
if __name__ == "__main__":
li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
print(li)
bubble_sort(li)
print(li)
最优时间复杂度O(n)
最坏时间复杂度O(n^2)
稳定性:稳定
3.选择排序法
def select_sort(alist):
"""选择排序"""
n = len(alist)
for j in range(n-1): #j : 0 ~n-2
min_index = j
for i in range(j+1, n):
if alist[min_index] > alist[i]:
min_index = i
alist[j], alist[min_index] = alist[min_index], alist[j]
if __name__ == "__main__":
ll = [54, 226, 93, 17, 77, 31, 44, 55, 20]
select_sort(ll)
print(ll)
最优时间复杂度O(n^2)
最坏时间复杂度O(n^2)
稳定性:不稳定(考虑升序每次选择最大的情况)
4.插入算法
def insert_sort(alist):
"""插入排序"""
n = len(alist)
#从右边的无序序列中取出多少个元素执行这样的过程
for j in range(1, n):
# j = [1, 2, 3, ... , n-1 ]
# i 代表内层循环的起始值
i = j
# 执行从右边的无序序列中取出第一个元素,即i位置的元素,然后将其插入到前面的正确位置中
while i > 0:
if alist[i] < alist[i-1]:
alist[i], alist[i-1] = alist[i-1], alist[i]
i -=1
else:
break
if __name__ == "__main__":
ll = [93, 54, 77, 31, 44, 55, 226]
print(ll)
insert_sort(ll)
print(ll)
最优时间复杂度O(n)
最坏时间复杂度O(n^2)
稳定性:稳定