經典演算法之計數排序

2021-06-21 17:13:19 字數 2110 閱讀 2020

一 引言

計數排序假設

n個輸入元素中的每乙個都是介於

0-k的整數,此處

k為某個整數。當k等於o(n)時,計數排序的執行時間為θ(n)。

二 基本思想

計數排序的基本思想就是對每乙個輸入元素x,確定小於x的元素個數。因此我們就可以直接把x放到最終輸出陣列中的相應位置上。

例如:如果有

17個元素小於x,則

x就位於第

18個輸出的位置上。當然有幾個元素相同時,這個方法就略微改進一下,因為不能將它們放在同乙個位置上。

三 具體實現

假定輸入陣列為

a[1..n]

,他們的值均位於

0~k之間,輸出排序之後的陣列為

b[1..n]

,以及臨時儲存陣列

c[0..k]

。計數排序的偽**如下:

上圖顯示出了計數排序的執行過程。

在第1~2行中的for迴圈初始化操作之後,在第3~4行檢查輸入的每乙個元素。如果輸入元素

的值為i,即增加c[i]的值。c[i]記錄了值為i的元素個數。

於是,在第4行之後c[i]中存放了等於i的元素的個數。在第6~7行中,通過

陣列c中記錄計數和,可以確定對每乙個i=0,1,2.....,k,有多少輸入元素是小於等於i的。

最後,在第9~11行中的for迴圈部分,把每乙個

元素a[j]放在輸出陣列b中與其相應的最終位置上。如果每乙個元素都不相同,則當第一次執行第9行時,對每乙個a[j],值c[a[j]]即

為a[j]在輸出陣列上的最終位置上,因為共有c[a[j]]個元素小於等於a[j]。

可是由於各個元素可能不一定是不同的,因此,每當將乙個值a[j]放入陣列b中時,都要減小c[a[j]]額值。這會使得下乙個值等於a[j]的輸入元素直接進入輸出陣列b中a[j]的前乙個位置。

四 **

/*********************************

* 日期:2014-04-26

* 題目: 計數排序

**********************************/

#include #include using namespace std;

void countingsort(int *a,int *b,int len,int k)

int c[k+1],i;

//初始化

for(i = 0;i <= k;i++)

//統計值為a[i]的個數,c[i]是等於i的元素個數

for(i = 0;i < len;i++)

//確定值a[i]在最終輸出陣列b中位置,c[i]是小於等於i的元素個數

for(i = 1;i <= k;i++)

//輸出到陣列b中

for(i = len-1;i >= 0;i--)

//b下標從1開始

}int main();

int b[9];

countingsort(a,b,8,5);

for(int i = 1;i <= 8;i++)

return 0;

}

五 時間複雜度分析

時間複雜度是多少呢?

第1~2行for迴圈所花時間為θ(k)。

第3~4行

for迴圈所花時間為θ(n)。

第6~7行for迴圈所花時間為θ(k)。

第9~11行

for迴圈所花時間為θ(n)。

這樣總的時間就是

θ(k+n)。在實踐中,檔k = o(n)時,我們常採用計數排序,這時執行時間為

θ(n)。

六 特點 1.

提前必須是已知待排序的關鍵字為整型且範圍已知。

2.時間複雜度為

o(n+k)

,不是基於比較的排序演算法,因此效率非常之高。

3.穩定性好,這個是計數排序非常重要的特性,可以用在後面介紹的基數排序中。

4.但需要一些輔助陣列,如

c[0..k]

,因此待排序的關鍵字範圍

0~k不宜過大。

經典演算法之計數排序

一 引言 計數排序假設 n個輸入元素中的每乙個都是介於 0 k的整數,此處 k為某個整數。當k等於o n 時,計數排序的執行時間為 n 二 基本思想 計數排序的基本思想就是對每乙個輸入元素x,確定小於x的元素個數。因此我們就可以直接把x放到最終輸出陣列中的相應位置上。例如 如果有17個元素小於x,則...

演算法之計數排序

核心思想 通過計算某個資料之前有多少個資料來確定自身的位置,不通過資料之間的相互比較,所以是非比較排序。原始計數排序 時間複雜度 o n k k為資料量 缺點 如果資料只有兩個,9999,10000,那麼會額外建立容量為10000的陣列,浪費空間。public static int countsor...

演算法之計數排序

原理 用乙個陣列記錄待排序陣列 現的數字。最低位代表最小值,偏移量是記錄陣列中的下標 待排序陣列 2 1 4 可以表示為 記錄陣列 1 1 0 1 陣列長度為 4 1 1 然後根據記錄陣列輸出結果 public static void countsort int arr if arr.length ...