演算法基礎 快排 歸併 堆排序比較

2022-08-22 00:15:09 字數 1096 閱讀 5283

1、快速排序,上**:

def

quicksort(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):

print

(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...