排序演算法(五) 線性時間排序之計數排序

2021-06-26 03:58:15 字數 926 閱讀 7515

計數排序假設n個輸入元素中的每乙個都是介於0到k之間的整數,此處k為某個整數。當k = o(n)時,計數排序的執行時間為o(n).

計數排序的基本思想是:對於每乙個輸入元素x,確定小於x的元素個數。利用這一資訊,就可以直接把x放到輸出陣列中的位置上了。例如,如果有17個元素小於x則x就應該放在第18個位置上。當有幾個元素相同時,這個方案要改,因為不能把他們放在同乙個輸出位置上。

在計數排序演算法的**中,假設輸入是乙個陣列a[1 .. n]. 還需要陣列b[1.. n]存放排序的輸出,c[0 .. k]提供臨時儲存空間。

演算法如下:

這裡注意c陣列,第乙個for迴圈中為c申請k個空間並且置零,第二的for迴圈中,c記錄了a陣列中每個元素出現的個數,第三個for迴圈中,利用c,記錄了a中每個元素最後一次出現的位置。第四個for迴圈中當元素依次取出是,c中表示a中相應元素位置的c[i]中的元素個數依次減1. 直到b中的元素放滿。

程式**:

/*

線性時間排序 -- 計數排序演算法

*/#include#includeusing namespace std;

//函式宣告

首先,計數排序不是乙個比較演算法。其次,計數排序在執行是需要申請兩個額外的空間。當a中的元素非常大且稀疏時,c中空間就會浪費,同時,如果a的規模很大時,其實不適用計數排序。但是,計數排序有乙個重要的性質,就是,它是穩定的排序。

線性排序之 計數排序

counting sort適用於排列分布比較集中的資料,即最大值和最小值相差不會太大,具體這個差在多少合適,還是以後值得我思考的問題?計數排序的演算法思想是需要分配3個陣列,original,counter original counter i counter i counter i 1 即計數為小...

排序演算法之計數排序

今在學習中,遇到計數排序演算法,雖然其對待排序的序列要求嚴格,但對於符合條件的序列來說,其時間複雜度很小。故列於此,僅為學習記憶。參考資料 對於僅由大寫字母 或小寫字母 構成的無序序列,可採用下面演算法進行排序。該演算法不在序列的每個元素間進行比較,而是使用了乙個額外的help整型字串來記錄每個元素...

演算法 排序之計數排序

最近想到演算法導論中的計數排序,看看理解的怎麼樣試著講講自己的理解。1 思想 計數排序 是 線性時間的 排序演算法,時間複雜度為o n 雖然有一定的侷限性。但是還是很好的一種演算法。用2個陣列進行額外的儲存資訊,陣列 c 是對 資料中值相同的 記錄下來,以便後面查閱 b 是輸出的有序陣列,再將有序的...