思路:假定整个序列由2部分组成,一部分有序,一部分无序;我们从无序的序列中找到其中的最小值,放到有序的末端。
初始时,默认有序的序列为[],整个序列都是无序的,找到其中的最小值,用 min 记录,最后用min对应的值和l[i=0]互换。以此类推,同时默认每次的min的初始值都为无序的首个元素的下标
defselect(list):
n =len(list)# 取出一个数值,假定其为最小数,与在它后面的n-1个数进行对比,取出最小数for j inrange(n-1):
min_data = j
# 每执行一次for循环,都会在min_data ~ n之间取出最小数,并将其放在队列首端# 因此j需要取值n-1次(因为最后一个数在上一次循环中已被判断较前一个数大,由此不需要再进行比较)for i inrange(min_data+1, n):iflist[i]<list[min_data]:
min_data = i
# 将最小值放在前端if min_data != j:list[min_data],list[j]=list[j],list[min_data]
2 插入排序
definsert(list):
n =len(list)# 从列表左边开始取值for i inrange(n):# 可用 for i in range(n, 0, -1):配合下方内部条件代替# 将取过的值按指定顺序排列(注意取值时要与外部for循环的取值方向相反#(确保内部for循环取值范围在外部循环的范围内)# for j in range(i, n):for j inrange(i,0,-1):iflist[j-1]<list[j]:list[j-1],list[j]=list[j],list[j-1]else:continue
3 快速排序
import random
defquicksort(L, low, high):# 传入2个下标,得到排序范围
i = low
j = high
# 递归函数,当排序对象完成排序时,i = j(递归到边缘时传入参数会出现大于的情况)if i >= j:print('***')return L
key = L[i]while i < j:while i < j and L[j]>= key:
j = j-1
L[i]= L[j]while i < j and L[i]<= key:
i = i+1
L[j]= L[i]
L[i]= key
quicksort(L, low, i-1)
quicksort(L, j+1, high)# 每次返回已经排好的列表print('1')return L
if __name__ =='__main__':
list1 =list(range(10))
random.shuffle(list1)print(list1)print(quicksort(list1,0,9))