演算法導論學習筆記(二)排序和順序統計量

2021-08-17 14:34:48 字數 2273 閱讀 5342

總結各種排序演算法,時間複雜度與空間複雜度,優缺點等。

堆排序的時間複雜度是θ(

nlogn)

θ (n

log⁡n)

,堆排序具有空間原址性。

堆是乙個陣列,可以看成一棵近似的完全二叉樹。除了最底層之外,該樹完全填滿,給定乙個節點i,可以很容易地計算其父節點為floor(i/2),左子節點為2i,右子節點為2i+1.

最大堆是指堆中最大元素存在於根節點。根節點的值大於等於子節點。

建立堆堆排序:建立最大堆,然後把根元素與最後乙個元素交換位置,再把節點n去掉,並使得剩餘n-1個節點重新滿足最大堆。重複此過程,則將按照從大到小的順序依次把元素從堆中取出。從而完成排序。

快排平均時間複雜度是θ(

nlogn)

θ (n

log⁡n)

,最壞時間複雜度是θ(

n2) θ(n

2)

。但是快排通常是實際應用中最好的選擇,原因如下:

快排:在陣列中隨機找到乙個元素,交換陣列中其他元素的位置,使得該元素左邊的數都比他小,右邊的數都比他大。遞迴呼叫。

從快排的原理,易知其平均時間複雜度是θ(

nlogn)

θ (n

log⁡n)

,在最壞的情況下,相當於插入排序,因此時間複雜度是θ(

n2) θ(n

2)

# -*- coding: utf-8 -*-

# 原址重排

defpartition

(a, p, r):

# 選擇乙個元素,然後把比他小的放在陣列的左邊,把比他大的放在陣列的右邊

x = a[r]

# 用i,j分表指向左邊的子陣列的終點、右邊的子陣列的終點

i = p - 1

j = p

while j < r:

if a[j] <= x:

i += 1

tmp = a[i]

a[i] = a[j]

a[j] = tmp

j += 1

# 交換

a[r] = a[i + 1]

a[i + 1] = x

return i + 1

defquicksort

(a, p, r):

''' :param a: 陣列

:param p: 陣列的起點下標

:param r: 陣列的終點下標

:return:

'''if p < r:

q = partition(a, p, r)

quicksort(a, p, q - 1)

quicksort(a, q+1, r)

if __name__ == '__main__':

a = [2,8,7,1,3,5,6,4]

quicksort(a, 0, len(a)-1)

print a

快排的隨機化版本

為了增加隨機性,使得劃分更加均勻,每次隨機從陣列中挑選乙個元素作為劃分節點。

所有基於比較的排序方法的時間複雜度的上界是θ(

nlogn)

θ (n

log⁡n)

。存在其他不適基於比較的排序演算法,可以達到線性時間複雜度。

假設n個輸入元素的每乙個都是在0-k之間的乙個整數。時間複雜度為θ(

n)θ (n

)。

計數排序的過程是:對每個輸入的元素,都統計比它小的元素的個數。這樣就可以直接把它在輸出陣列的位置上插入。當有幾個元素相同時要稍作修改。

計數排序是穩定的。

基數排序是指先按照最低有效位進行排序來解決卡片排序問題。之所以先按照最低有效位排序,是因為高位比低位優先順序要高。為了確保基數排序的有效性,一位數排序演算法必須是穩定的。

應用:用基數排序來對具有多個關鍵字域的記錄進行排序。

假設資料服從均勻分布。

桶排序將[0,1)區間劃分成n個大小相同的區間,稱為桶。然後把n個輸入分別放到各個桶中。再對各個桶的資料排序。

因為資料是均勻分布的,所以不會出現很多資料落在同乙個桶的情況。

最大值、最小值:因為每個元素都需要比較,所以時間複雜度為θ(

n)θ (n

)。

中位數和順序統計量:時間複雜度也為θ(

n)θ (n

)。思想類似於快排。只不過只處理遞迴劃分的一邊即可。

排序和順序統計量(演算法導論)

人一生別太狂,指不定誰輝煌 總結排序演算法的執行時間 演算法最壞執行時間 平均期望執行時間 是否是原址排序 插入排序o n2 o n2 是 歸併排序o nlgn o nlgn 否 堆排序o n lgn 是快速排序o n2 o nlgn 期望 是 計數排序o k n o k n 否基數排序o d k ...

演算法導論 1 排序演算法

排序演算法是最基礎的一類演算法。主要排序演算法包括選擇排序 插入排序 氣泡排序 合併排序 堆排序和快速排序。把這些排序演算法全部實現一邊,再把 演算法導論 對應章節後面的習題做一遍,確實是系統學習演算法的乙個不錯的開端。選擇排序的想法很簡單,把需要排序的陣列看成一堆撲克牌 先查一遍,抽出最小的作為第...

排序和順序統計學(演算法導論)

1.堆排序 堆資料結構是一種陣列物件,它可以被視為一顆完全二叉樹。存放時利用了二叉樹,父親節點序號 i 子節點序號 2 i,2 i 1 的性質 堆的建立,調整,輸出例項如下 include include includeusing namespace std root從data 1 開始存起 我想到...