1、快速排序,上**:
defquicksort(arr):
if len(arr) <= 1:
return
arr v =arr[0]
high = [i for i in arr[1:] if i>=v]
low = [i for i in arr[1:] if ireturn quicksort(low) + [v] + quicksort(high)
分析一哈:
當不考慮最差情況(o(n^2))時,快排時間複雜度為o(nlogn):因為層數為o(logn)即呼叫棧的高度是o(logn),而每層的時間是o(n)
2、合併排序
採用分而治之的方法,先把陣列分成乙個個長度為1的陣列,再將陣列分別按順序組合成乙個陣列
因此涉及到兩個過程:切分、組合
1.組合過程:兩個有序陣列按順序合併為乙個陣列defmerge(a, b):
i, j =0, 0
c =while i < len(a) and j if a[i] <=b[j]:
i += 1
else
: j += 1c.extend(a[i:])
c.extend(b[j:])
return
c2.切分過程:只要陣列長度大於1就由上而下切割陣列,最後自下而上合併
defmerge_sort(arr):
(arr)
if len(arr) <= 1:
return
arr mid = len(arr) / 2
#dividing the array up to bottom
back =merge_sort(arr[:mid])
fore =merge_sort(arr[mid:])
#merge every 1 length array to the complete
return merge(back, fore)
時間複雜度:最好和最差都是o(nlogn) 空間複雜度:o(logn)
以空間換時間的典型栗子
排序演算法 快排,歸併
從陣列中隨機選乙個數,比這個數大的放右邊,比這個數小的放左邊。快排中的乙個細節 如果乙個數等於p的時候,既可以在左邊又可以在右邊。這麼做是為了避免如果陣列中所有的數都一樣,則會造成資料的不平衡。快排的目的是能夠使得左邊和右邊的數都差不多,這樣的話時間複雜度就不會退化到o n 2 而是o n logn...
排序演算法 歸併 快排
歸併排序的思想是分治法,如果想要將乙個陣列排序,那麼將這個陣列分為左區間和右區間,左區間一定是小於右區間的,再將左區間繼續劃分,右區間也繼續劃分。最後將排好序的陣列全都歸併起來,這樣聽起來像是從上向下劃分,其實歸併排序主要是是從下向上,合併的過程。先將單個元素的陣列歸併為兩個元素的有序陣列 再將包含...
快排 堆排序
快速排序主要運用了二分的思想,每次選擇乙個基準元素,比基準元素打的元素都放在基準元素前面,比基準元素小的元素都放在基準元素後面,這樣不斷遞迴細分,完成排序。void quicksort int a,int l,int r if ia i a j i while ia i temp if ia j a...