不管所堆排序,還是快速排序,排序的本質都所基於各個元素之間的比較。而可以證明的是,所有基於比較的排序演算法,在最壞情況下的時間複雜度的下界是o(nlgn)。
而,計數排序不所基於元素之間的比較,而是,對於乙個輸入x,在整個輸入中確定出小於x的元素個數,這樣就可以把元素x直接放在它在最終輸出陣列中的確定位子上。
基本思想:
所有輸入放入陣列a中(元素下標從1開始)
最終輸出在陣列b中
臨時陣列c[0...k],其中k為陣列a中最大元素的值
1.首先初始化陣列c
2.統計陣列a中元素值為x的元素個數,可能a中有多個元素的值為x,結果放入c[x]中
3.c[i] += c[i - 1],這樣,c[i]中放入的就是a中小於、等於i的元素個數
4.將陣列a中各元素放入最終陣列的適當位子
b[c[a[j]]] = a[j]
這個表示式怎樣理解呢?假設a[j] = x,則需要確定x最終應該放在陣列b的哪個位子上。由於陣列中小於等於x的元素個數放在c[x]中,假設c[x]=y,則x最終應該放在陣列b的y位子,也即b[y] = x,綜上,b[y] = b[c[x]] = b[c[a[j]]] = x = a[j]。
然後 --c[a[j]],由於元素x已經放入了最終陣列中,所以下乙個元素值也為x的元素z,直接進入最終陣列b中a[j]的前乙個位子。
經過以上分析,可見,計數排尋所穩定排序。
穩定:具有相同值的元素在輸出陣列中的相對次序與其在輸入陣列中的次序相同。
**:
測試資料:
please enter some nums to sort by 1000 end
2 5 3 0 2 3 0 3 1000
0 0 2 2 3 3 3 5
演算法導論 計數排序
計數排序假設n個輸入元素中的每乙個都是介於0到k之間的整數,此處k為某個整數。計數排序的基本思想就是對每乙個輸入元素x,確定出小於x的元素個數。有了這一資訊,就可以把x直接放到它在最終輸出陣列中的位置上。例如,如果有17個元素小於x,則x就屬於第18個輸出位置。當有幾個元素相同時,這個方案要略作修改...
計數排序(線性時間排序) 演算法導論
之前的排序都是通過比較得到的,即比較排序 在排序的最終結果中,各元素的次序依賴與它們之間的比較。而時間複雜度最好的也是o nlgn 接下來說乙個未經比較的排序,而複雜度則是線性的。計數排序 假設n個輸入元素的每乙個都是在0 k區間內的乙個整數,其中k為某個整數。當k o n 時,排序的執行時間為o ...
演算法導論 c 實現計數排序
計數排序的基本思想為 對每乙個輸入的元素x,確定出小於x的元素的個數。有了這一資訊,那麼就可以把x直接放到相應的位置上。特點 1 需要臨時的儲存空間,如果排序資料範圍特別大時,空間開銷很大。2 適合於排序0 100以內的資料。3 排序的時間複雜度為o n include include const ...