比較排序指在排序的最終結果各元素的次序依賴於它們之間的比較的排序演算法。
在最壞情況下,任何比較排序演算法都需要做ω(nlgn)次比較。因此堆排序和歸併排序都是漸近最優的比較排序演算法。
本章討論三種用運算而不是比較來確定排序順序的線性時間複雜度的排序演算法:
計數排序假設n個輸入元素中的每乙個都是在0~k區間的乙個整數,對每乙個輸入元素x,確定小於x的元素個數,並利用這一資訊直接把x放在它輸出陣列中應該在的位置上:
該過程需要三個陣列的空間,輸入陣列a[1…n],輸出陣列b[1…n],臨時儲存空間c[0…k],其中c[i]儲存的就是小於或等於i的元素個數。執行過程:
總的執行代價是θ(k+n),因此在實際應用中當k=o(n)時可以使用計數排序,執行時間為θ(n)。
計數排序具有乙個重要性質即它是穩定的,具有相同值的元素在輸出陣列中的相對順序與在輸入陣列中的相對順序相同。
基數排序是一種用在卡片排序機上的演算法,卡片排序機一次只能檢視穿孔卡片的一列,即十進位制數字的一位。對於n個d位數,基數排序先按最低有效位進行排序,然後再依次按更高有效位排序,排序方法必須使用穩定的排序方法如計數排序:
執行過程:
給定n個d位數,其中每一位有k個可能取值,則若radix-sort使用的穩定排序方法耗時θ(n+k),則它可以在θ(d(n+k))時間內將所有數排序。所以當d為常數且k=o(n)時,基數排序的總時間為θ(d(n+k))。
桶排序假設輸入資料服從均勻分布,其平均時間代價為o(n)。
桶排序將輸入區間劃分為n個相同大小的子區間,稱為桶。然後將輸入數分別放在各個桶中,對每個桶中的數進行排序,最後依次序取出各個桶中的元素。具體實現時採用鍊錶來表示桶:
執行過程:
演算法中除了第8行的n次插入排序外其他各行時間代價都是o(n),所以桶排序的時間代價為:
兩邊取期望:
由輸入陣列a等概率落入任意乙個桶,可以推導出:
演算法導論 第8章 線性時間排序 計數排序
計數排序 n個元素都是0到k範圍得整數,當k o n 時,排序執行時間為o n 思想 對於數x,確定小於x的個數m,將x放在第m 1個位置上 例子 假設3個元素小於x,那麼x應該放在4上 輸入第一行的第乙個數n是陣列的個數,第一行第二個數表示所有n的元素中最大的數k 接下來的第二行就是n個數字 輸入...
演算法導論第8章線性時間排序 Python實現
計數排序 def counting sort a,b,k c 0 for i in range k length len a for i in range length c a i 1for i in range 1 k c i c i c i 1 for i in range k c i 1 fo...
《演算法導論》第8章 線性時間排序 1 計數排序
一種簡單的實現是得到陣列c,c i 表示陣列a中值為i的元素個數。c 就表示兩個0,兩個2,三個3,乙個5。然後將這些數字依次存到陣列b中。include include void printarray int,int void counting sort int a,int b,int len,i...