python的冒泡排序和快速排序
冒泡排序: 相邻两个元素比较,大的排后面,第一次把最大的数排在最后一位;
继续排,把第二大的数排在倒数第二位…
冒泡排序总共排的次数为:1+2+3+…+n-1,共 n(n-1)/2,时间复杂度为n平方;
def bubble_sort(li):
s=range(len(li))[::-1] #交换次数[7, 6, 5, 4, 3, 2, 1, 0]
for i in s:
for j in range(i):
if li[j]>li[j+1]:
li[j],li[j+1]=li[j+1],li[j] #交换元素
return li
m=[12,32,4,5,6,8,0,90]
print(bubble_sort(m))
方法(2)
def dubble_sort(li):
for i in range(len(li)-1):#i是索引,表示趟数
for j in range(len(li)-i-1):#j是除去i个元素后的列表的索引(循环进行了几次就说明有几个元素已经被排好序)
if li[j]>li[j+1]:
li[j],li[j+1]=li[j+1],li[j]
return li
li=[5,6,78,9,34,56,90,0,4]
print(dubble_sort(li))
优化:如果冒泡排序执行了一趟而没有交换发生,说明该列表已经是有序状态,可以直接结束算法
def dubble_sort2(li):
for i in range(len(li)-1):#i是索引,表示趟数
change=False
for j in range(len(li)-i-1):#j是除去i个元素后的列表的索引(循环进行了几次就说明有几个元素已经被排好序)
if li[j]>li[j+1]:
li[j],li[j+1]=li[j+1],li[j]
change=True
if not change:
return li
return li
li=list(range(1000))
print(dubble_sort2(li))
快速排序:选取数组的某一个数作为基准(一般选第一个最后一位), 排列整个数值,比基准小的排到左边,比基准大的数 排在右边
继续选取新生成的数值的第一个数 进行排序; 时间复杂度为nlogn
def quick_sort(list):
if len(list)< 2: #基线条件(停止递归的条件)
return list
else: #递归条件
basevalue=list[0] #以第一个为基准值
less=[m for m in list[1:] if m < basevalue] #比基准小的
equal=[n for n in list if n == basevalue]
greater=[s for s in list[1:] if s > basevalue] #比基准大的
return quick_sort(less)+ equal+quick_sort(greater)
list=[9,8,11,88,77]
print(quick_sort(list))
#结果[8, 9, 11, 77, 88]
用列表生成式:
quickSort = lambda array: array if len(array) <= 1 else quickSort([item for item in array[1:] if item <= array[0]]) + [array[0]] + quickSort([item for item in array[1:] if item > array[0]])