//counting sort 計數排序
//參考演算法導論8.2節
#include#include
#include
#include
using
namespace
std;
const
int k=5
;const
int n=7
;int a[n]=;
intb[n];
int c[k+1
];int
main()
assert(maxn
<=k);
//統計<=i的個數, c[i]就是最終i要放置的位置
for(int i=1;i<=maxn;i++)
for(int i=0;i<=maxn;i++)
printf(
"%d
", c[i]);
printf("\n
");for(int i=n-1;i>=0;i--)
for(int i=0;i)
printf(
"%d
", b[i]);
printf("\n
");return0;
}
計數排序的總執行時間為θ(k + n),當k = o(n)時,執行時間為θ(n)
優於比較排序的下界ω(nlgn),因為在計數排序的過程中沒有出現輸入元素之間的比較,而是用了輸入元素的實際值來確定它們在陣列的位置。
額外插入排序演算法的穩定。
排序演算法的穩定的定義為:具有相同值的元素在輸出陣列中的相對次序與它們在輸入陣列中的次序相同。可參考維基
對於簡單資料的排序,穩定性好像沒什麼作用,但是對於複雜資料(不只一項屬性)的排序,穩定性很重要。
計數排序是穩定的排序,因此計數排序被用作基數排序演算法的子過程。
練習8.2-2
在counting_sort過程中,假設將for(j = length; j >= 1; j--) 改為for(j = 1; j <= length; j++)。證明該演算法仍能正常地工作,修改後的演算法是穩定的嗎?
計數排序演算法不依賴陣列a的順序,所以仍能正常執行,而且結果正確。
但是修改後的演算法不穩定。因為沒修改前,在陣列a裡靠後的元素,在陣列b也靠後(針對與元素值相同),如果修改後,結果會相反。違反了具有相同值的元素在輸出陣列中的相對次序與它們在輸入陣列中的次序相同,即穩定性。
練習8.2-4
給出乙個演算法,使之對於給定介於0和k之間的n個整數進行預處理,並能在o(1)時間內,回答出輸入的整數中有多少個落在區間[a..b]內。你給出的演算法的預處理時間應為θ(n + k)。
用乙個陣列c,記錄小於或等於其每個下標的值的元素個數。c[b] - c[a-1]為落在區間內的元素個數
compute thecarray as is done in counting sort. the number of integers in the
range [a..b]isc[b]−c[a−1], where we interpretc[−1] as 0.
計數排序Counting sort
經典排序演算法 計數排序counting sort 注意與基數排序區分,這是兩個不同的排序 計數排序的過程類似小學選班幹部的過程,如某某人10票,作者9票,那某某人是班長,作者是副班長 大體分兩部分,第一部分是拉選票和投票,第二部分是根據你的票數入桶 看下具體的過程,一共需要三個陣列,分別是待排陣列...
計數排序Counting sort
經典排序演算法 計數排序counting sort 注意與基數排序區分,這是兩個不同的排序 計數排序的過程類似小學選班幹部的過程,如某某人10票,作者9票,那某某人是班長,作者是副班長 大體分兩部分,第一部分是拉選票和投票,第二部分是根據你的票數入桶 看下具體的過程,一共需要三個陣列,分別是待排陣列...
計數排序Counting sort
注意與基數排序區分,這是兩個不同的排序 計數排序的過程類似小學選班幹部的過程,如某某人10票,作者9票,那某某人是班長,作者是副班長 大體分兩部分,第一部分是拉選票和投票,第二部分是根據你的票數入桶 看下具體的過程,一共需要三個陣列,分別是待排陣列,票箱陣列,和桶陣列 var unsorted ne...