python数据结构与算法:排序算法(面试经验总结)
生活随笔
收集整理的這篇文章主要介紹了
python数据结构与算法:排序算法(面试经验总结)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
快排:最優(yōu)復(fù)雜度 O(n*logn) 最壞時間復(fù)雜度O(n^2)平均時間復(fù)雜度n^(1.3)
?
歸并排序:最優(yōu)/平均/最壞? 時間復(fù)雜度均O(nlogn),但是內(nèi)存占用為list大小的兩倍,算法穩(wěn)定?
?
############################## p5 排序 ###################################
def bubble_sort(alist):"""順序表實現(xiàn)bubble"""n=len(alist)for j in range(0,n-1):#遍歷次數(shù),沒遍歷一次 遍歷長度-1 遍歷j次 -jcount = 0for i in range(0,n-1-j):#一次循環(huán)找到最大值,并且移動到最后位置 主體if alist[i]>alist[i+1]:alist[i],alist[i+1]=alist[i+1],alist[i]count+=1if 0 == count:return #####count 優(yōu)化 不交換數(shù)字 不增加計數(shù)def choose_sort(alist):"""選擇排序:找到最小的數(shù)字,放到最前面"""min = 0n = len(alist)for j in range(0,n-2):min = jfor i in range(j+1,n):if alist[min]>alist[i]:min = ialist[j],alist[min] = alist[min],alist[j]def insert_sort(alist):"""插入排序,從右邊去除一個數(shù) ,房子啊最左邊 在最左邊排序,不斷地從右邊獲取后面的數(shù)字"""n = len(alist)#從右邊的無序序列中取出多少個元素執(zhí)行這樣的過程for j in range(1,n):#內(nèi)層循環(huán)的起始值i = j#執(zhí)行從右邊的無序序列中去除第一個元素,即i位置的元素,插入到正確的位置while(i>0): #for i in range(i,0,-1)if alist[i] < alist[i-1]:alist[i], alist[i-1] = alist[i-1], alist[i]i -= 1else:breakdef shell_sort(alist):""""希爾排序 不穩(wěn)定 O(n^2) 分而治之 p5.7 -p5.8"""n = len(alist)gap = n//2 # python取整 雙斜線while gap >= 1:#該循環(huán)將gap 變換到1 之前#插入算法與普通插入算法一樣for j in range(gap,n):#j = [gap,gap+1,gap+2,.....,n ]i = jwhile(i>0): ###除了間隔 gap 和插入算法一摸一樣if alist[i] < alist[i-gap]:#alist[i],alist[i-gap] = alist[i-gap],alist[i]i -= gapelse:breakgap //= 2def quick_sort(alist, first, last):""""#快速排序 遞歸嵌套 最優(yōu)時間復(fù)雜度nlgn"""if first >= last:returnlow = firsthigh = lastmid_value = alist[first]while low < high:while low < high and alist[high] >= mid_value: #high左移high -= 1alist[low] = alist[high]while low < high and alist[low] < mid_value: # low右移low += 1alist[high] = alist[low]# 從循環(huán)退出時 low = highalist[low] = mid_valuequick_sort(alist,first,low-1) #對low左邊的列表執(zhí)行快排quick_sort(alist,low+1,last) #對low右邊的列表執(zhí)行快排def merge_sort(alist):"""有額外開銷 需要兩倍的存儲空間"""n = len(alist)if n<= 1:return alistmid = n//2###拆分的過程部分代碼left_li = merge_sort(alist[:mid])right_li = merge_sort(alist[mid:])## 合并的部分代碼 merge(left,right)left_pointer, right_pointer = 0, 0result = []## 調(diào)整內(nèi)部順序while left_pointer < len(left_li) and right_pointer < len(right_li):if left_li[left_pointer] <= right_li[right_pointer]:result.append(left_li[left_pointer])left_pointer += 1else:result.append(right_li[right_pointer])right_pointer += 1#####合并切片result += left_li[left_pointer:]result += right_li[right_pointer:]return resultif __name__ == "__main__":li = [54, 26, 2, 4, 5, 100, 102]print(li)# quick_sort(li, 0, len(li)-1)result_li = merge_sort(li)print(result_li)"""merge_sort=[54, 26, 2, 4, 5, 100, 102]left_li = [54, 26, 2, 4] right_li=left_li = [54, 26] right_li = [2, 4] left_li = [54] right_li = [26]左邊一半完成分割,開始進行排序操作執(zhí)行 if n<= 1: list長度為1 ,返回自身 left_li = [54] right_li = merge_sort(alist[mid:]) = merge_sort(【54,26】[mid=1:])=[26]right_li = [26][54,26] 進行主循環(huán) 返回[2,4] 開始 執(zhí)行 ## 調(diào)整內(nèi)部順序"""
?
總結(jié)
以上是生活随笔為你收集整理的python数据结构与算法:排序算法(面试经验总结)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: yolov3(三:算法框架解析)
- 下一篇: 多传感器融合之滤波(二)EKF