defbubble_sort(alist):"""冒泡排序"""
n = len(alist)
for j in range(1,n-1):
# exchange_flag = Falsefor i in range(n-j):
if alist[i] > alist[i+1]:
alist[i],alist[i+1] = alist[i+1],alist[i]
exchange_flag = True# if not exchange_flag:# break
defselection_sort(alist):"""选择排序"""
n = len(alist)
for j in range(n):
min_flag = j
for i in range(j+1,n):
if alist[i] < alist[min_flag]:
min_flag = i
alist[j],alist[min_flag] = alist[min_flag],alist[j]
3 插入排序—-稳定
将序列分为两部分,一部分是有序的,一部分是无序的
起始:将角标为0的元素认定为有序的,后面的认为是无序的
将无序的元素与有序的元素,逐个对比,若无序元素大,则不变,
若无序元素小,则与比对元素替换,并继续与角标小的有序元素逐个继续比对, 直至比对到无序元素为大
两个for循环,内部循环负责依次往前比对,遇到比自己大的元素则替换
外部循环负责每次内部循环开始的位置,从角标1到最后
时间复杂度:最优O(n) 最坏O(n**2)
最优:升序排列,序列已经处于升序状态
definsert_sort(alist):"""插入排序"""
n = len(alist)
for j in range(1,n):
for i in range(j,0,-1):
if alist[i] < alist[i-1]:
alist[i],alist[i-1] = alist[i-1],alist[i]
else:
break
4 希尔排序—-不稳定
插入排序的优化版本,将无序的序列变得相对有序
内部循环每次根据步长分组,每次循环的步长为上次的一半,直至最后一次按照插入排序进行
原理是相对有序的序列在进行插入排序的时候break的机会增多,时间复杂度为nlogn~ n**2
内部循环因为步长不同的时候均有循环,不确定循环次数,用while,用i<=gap控制循环结束
时间复杂度:最优:以步长序列不同而不同 最坏:O(n**2)
最坏:步长为1,即插入排序
defshell_sort(alist):"""希尔排序"""
n = len(alist)
gap = n//2while gap > 0:
for i in range(gap, n):
while i >= gap and alist[i] < alist[i - gap]:
alist[i], alist[i - gap] = alist[i - gap], alist[i]
i -= gap
gap //= 2
def quick_sort(alist,start,end):
"""快速排序"""ifstart >= end:
return
left = startright = end
base_value = alist[left]
while left < right:
while left < rightand base_value <= alist[right]:
right -= 1
alist[left] = alist[right]
while left < rightand base_value > alist[left]:
left += 1
alist[right] = alist[left]
alist[left] = base_value
quick_sort(alist,start,left-1)
quick_sort(alist,left+1,end)
归并排序—-稳定
递归思想,自己调用自己进行拆分
第一步:二步拆分,直至把所有的元素拆开为单个存在的列表
第二步:循环,合并数组,逐步分组排序,两组直接进行比较列表
新建列表,把元素按大小加入到新的列表中
时间复杂度:最优最坏均为:O(nlogn)
拆分为O(1),两两合并为O(n),两两合并共执行了logn次
归并排序因为重新定义了一个列表,所以在空间上额外需要消耗一块内存
defmerge_sort(alist):"""归并排序"""
n = len(alist)
if n == 1:
print(alist)
return alist
left,right = 0,0
mid_flag = n // 2
left_list = merge_sort(alist[:mid_flag])
right_list = merge_sort(alist[mid_flag:])
merge_sort_list = []
lcount = len(left_list)
rcount = len(right_list)
while left < lcount and right < rcount:
# 加上等号,是稳定的if left_list[left] <= right_list[right]:
merge_sort_list.append(left_list[left])
left += 1else:
merge_sort_list.append(right_list[right])
right += 1
merge_sort_list += left_list[left:]
merge_sort_list += right_list[right:]
return merge_sort_list
if __name__ == '__main__':
alist = [54,26,93,17,77,31,44,55,20]
# bubble_sort(alist)# selection_sort(alist)# insert_sort(alist)# quick_sort(alist,0,len(alist)-1)# shell_sort(alist)# print(alist)
print(merge_sort(alist))