總結各種排序演算法,時間複雜度與空間複雜度,優缺點等。
堆排序的時間複雜度是θ(
nlogn)
θ (n
logn)
,堆排序具有空間原址性。
堆是乙個陣列,可以看成一棵近似的完全二叉樹。除了最底層之外,該樹完全填滿,給定乙個節點i,可以很容易地計算其父節點為floor(i/2),左子節點為2i,右子節點為2i+1.
最大堆是指堆中最大元素存在於根節點。根節點的值大於等於子節點。
建立堆堆排序:建立最大堆,然後把根元素與最後乙個元素交換位置,再把節點n去掉,並使得剩餘n-1個節點重新滿足最大堆。重複此過程,則將按照從大到小的順序依次把元素從堆中取出。從而完成排序。
快排平均時間複雜度是θ(
nlogn)
θ (n
logn)
,最壞時間複雜度是θ(
n2) θ(n
2)
。但是快排通常是實際應用中最好的選擇,原因如下:
快排:在陣列中隨機找到乙個元素,交換陣列中其他元素的位置,使得該元素左邊的數都比他小,右邊的數都比他大。遞迴呼叫。
從快排的原理,易知其平均時間複雜度是θ(
nlogn)
θ (n
logn)
,在最壞的情況下,相當於插入排序,因此時間複雜度是θ(
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
logn)
。存在其他不適基於比較的排序演算法,可以達到線性時間複雜度。
假設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 開始存起 我想到...