1.冒泡排序:
过程
列表每两个相邻的数,如果前面的比后面的大,则交换这两个数。 一趟排序完成后,则无序区减少一个数,有序区增加一个数
特点
每一趟都是对无序区进行的
冒泡排序需要进行n-1趟
时间复杂度为O(n^2)
优化,如果某一趟后不再发生交换,则已经排序完成
python代码
def bubble_sort(list):
for i in range(len(list)-1): #第i趟
for j in range(len(list)-i-1 ): #指针的位置(当前下标)
if list[j]>list[j+1]: #改为<则为降序排列
list[j],list[j+1]=list[j+1],list[j]
#优化
def bubble_sort1(list):
for i in range(len(list)-1): #第i趟
exchange=False
for j in range(len(list)-i-1 ): #指针的位置(当前下标)
if list[j]>list[j+1]: #改为<则为降序排列
list[j],list[j+1]=list[j+1],list[j]
exchange=True
print(list)
if exchange==False:
return
2.选择排序
过程
每次找出最小的数,n-1趟,时间复杂度为O(n^2)
代码
def select_sort0(list):
list_new=[]
for i in range(len(list)):
min_val=min(list) #O(n)
list_new.append(min_val)
list.remove(min_val) #O(n)
return list_new
#优化 每次找到最小值后将其放在最前面
def select_sort2(list):
for i in range(len(list)-1): #第i趟
min_loc=i
for j in range(i,len(list)):
if list[j]<list[min_loc]:
min_loc=j
list[i],list[min_loc]=list[min_loc],list[j]
print(list)
list=[3,1,5,9,7,2,6]
print(select_sort2(list))
插入排序
过程
初始有序
从无序区摸一张牌,插到有序区的正确位置
时间复杂度为O(n^2)
代码
def insert_sort(list):
for i in range(1,len(list)): #i 为摸到的牌的下标
temp=list[i]
j=i-1 #j指的是手里的牌的下标
while j>=0 and list[j]>temp:
list[j+1]=list[j] #如果手上的牌比摸上来的牌大,则把手上的牌向后移一个位置
j-=1
list[j+1]=temp #经过上面的while循环后,摸到的这张牌已经到了正确位置上,其下标变为原有序区中最后一个大于它的值的下标
li=[3,5,2,1]
insert_sort(li)
print(li)