1. 冒泡排序
- 冒泡排序: 相邻元素两两比较,大的往后放,第一次完毕后最大值就出现在最大索引处,同理,继续,即可得到一个排好序得数组
规律
- (1)两两比较,大的向后放
- (2)每一次比较完成后,下一次比较就会减少一个元素得比较
- (3)第一次比较,有0个元素不比
- 第二次比较,有1个元素不比
- 第三次比较,有两个元素不比
- …
- (4)总共需要比较数组长度-1次
# 冒泡算法
# 列表元素两两比较大的值向后移动
def bubbleSort(alist):
# 外层循环第一次,内层循环4次;外层循环第二次,内层循环3次;外层循环第三次,内层循环2次.
for j in range(len(alist) - 1):
# 首先两两比较,将最大得值移至末尾,需要比较4次
# 下面得操作第一次用在n个数上,第二次用在前n-1,第三次用在前n-2个数上
for i in range(len(alist) - 1 - j):
if alist[i] > alist[i + 1]:
alist[i], alist[i + 1] = alist[i + 1], alist[i] # 换位
return alist
alist = [3, 8, 5, 7, 6]
print(sort(alist))
2. 选择排序
上面动画是按最小排序,也可以按最大排
思想:假如有n个乱序元素.设置初始最大值索引为0,然后两两比较,更新最大值得索引,直到找到最大值,然后将这个最大值跟最后一个元素[n-1]交换位置;然后,找出前n-1最大值得索引,在与倒数第二个元素[n-2]交换位置
# 选择排序
# 将乱序中的最大值找出,跟最后一个元素交换位置
def sort(alist):
for j in range(len(alist)-1):
max_index = 0
for i in range(1, len(alist)-j):
if alist[max_index] < alist[i]:
max_index = i # 找到所有值中最大值得下标
alist[len(alist)-1-j], alist[max_index] = alist[max_index], alist[len(alist)-1-j]
return alist
alist = [3, 8, 5, 7, 6]
print(sort(alist))
总结: 选择排序元素交换得次数要少于冒泡排序交换得次数。
3. 插入排序
思想: 每次取一个列表元素与列表中已经排序好的列表段进行比较,然后插入从而得到新的排序好得列表段,最终获得排序好的列表,比如,待排序列表为[49, 38, 65, 97, 76, 13, 27, 49 ]则比较的步骤和得到得新列表如下:(带有背景颜色得列表段是已经排序好的,红色背景标记的是执行插入并且交换过得元素)
思路:[3,8,5,7,6]
(1):当i=1时,alist[i]可以理解为无序子集中的第一个元素8,alist[i-1] 可以理解为有序子集中的最后一个元素3,因为此是有序子集中只含有一个元素,那么当alist[i]<alist[i-1],交换顺序,i = i+1移位即可;当alist[i]>alist[i-1],则只需保持位置然后更新i,i = i+1移位即可。结果是有序子集变为[3,8],无序子集中变为[5,7,6]。
(2):当i=2时,若alist[i]<alist[i-1]即5<8,这时不能简单交换顺序,因为还要判断5是否比3大还是比3小,所以此时i的更新应该时i = i-1,这样下次循环比较的时候为alist[1]<alist[0]即5与3进行比较,根据情况然后在决定是否交换位置,循环的条件是i大于0。
'''
# 插入排序算法
alist = [3, 8, 5, 7, 6]
# 有序子集中元素的个数,还可以表示为下标
i = 1
# alist[i]可以理解为无序子集中的第一个元素
# alist[i-1] 可以理解为有序子集中的最后一个元素
if alist[i] < alist[i-1]: # 乱序子集中的第一个元素值小于有序子集中最后一个元素的值,交换位置
alist[i], alist[i-1] = alist[i-1], alist[i]
else: # 乱序子集中的第一个元素值大于有序子集中最后一个元素的值,位置不变
pass
i = i+1 # 以上两种情况都需要进行i的移位
i = 2
while i > 0:
if alist[i] < alist[i-1]:
alist[i], alist[i - 1] = alist[i - 1], alist[i]
i-=1 # 在有序子集中进行比较,向前更新i
else:
break
'''
# 完整代码
def insertionSort(alist):
for i in range(1, len(alist)): # 第一个元素默认在有序子集中,剩余n-1个元素需要插,所以循环n-1次即可
while i > 0:
if alist[i] < alist[i - 1]:
alist[i], alist[i - 1] = alist[i - 1], alist[i]
i -= 1
else:
break
return alist
alist = [3, 8, 5, 7, 6]
print(insertionSort(alist))