演算法導論學習筆記(3) 計數排序

2021-06-06 03:34:11 字數 1351 閱讀 5486

計數排序是一種演算法複雜度 o(n) 的排序方法,適合於小範圍集合的排序。比如100萬學生參加高考,我們想對這100萬學生的數學成績(假設分數為0到100)做個排序。我們如何設計乙個最高效的排序演算法。本文不光給出計數排序演算法的傳統寫法,還將一步步深入討論演算法的優化,直到時間複雜度和空間複雜度最優。

計數排序是乙個類似於桶排序的排序演算法,其優勢是對已知數量範圍的陣列進行排序。它建立乙個長度為這個資料範圍的陣列c,c中每個元素記錄要排序陣列中對應記錄的出現個數。這個演算法於2023年由 harold h. seward 提出。

計數排序的基本思想是對每個輸入元素x,確定出小於x的元素個數,有了這一資訊就可以把x直接放到它在最終輸出陣列的位置上,由於演算法導論上寫的比較複雜,這裡用自己的**來實現計數排序:

這裡有乙個注意的地方:就是在排序過程中生成的兩個臨時陣列的大小是length,其實應該是以原始陣列中最大的元素為陣列長度的(如果最大元素小於原始陣列長度則臨時長度為原始陣列長度),但是找出最大元素又要耗時o(n).

c++**:

#include

<

stdio.h

>

#include

<

stdlib.h

>

//計數排序

intcountsort(

int*

pdata,

intnlen)

//記錄排序記數。在排序的值相應記數加1。

for(

inti=0

; i<

nlen;

++i)

//確定不比該位置大的資料個數。

for(

inti=1

; i<

nlen;

++i)

int*

psort

=new int[length];

for(inti=

0; i

<

nlen;

++i)

//排序結束,複製到原來陣列中。

for(

inti=0

; i<

nlen;

++i)

//最後要注意釋放申請的空間。

delete pcout;

delete psort;

return1;

}int

main()

;countsort(ndata,

10);

for(

inti=0

; i<10;

++i)

printf("\n

");system(

"pause");

return0;

}

演算法導論 計數排序

不管所堆排序,還是快速排序,排序的本質都所基於各個元素之間的比較。而可以證明的是,所有基於比較的排序演算法,在最壞情況下的時間複雜度的下界是o nlgn 而,計數排序不所基於元素之間的比較,而是,對於乙個輸入x,在整個輸入中確定出小於x的元素個數,這樣就可以把元素x直接放在它在最終輸出陣列中的確定位...

演算法導論 計數排序

計數排序假設n個輸入元素中的每乙個都是介於0到k之間的整數,此處k為某個整數。計數排序的基本思想就是對每乙個輸入元素x,確定出小於x的元素個數。有了這一資訊,就可以把x直接放到它在最終輸出陣列中的位置上。例如,如果有17個元素小於x,則x就屬於第18個輸出位置。當有幾個元素相同時,這個方案要略作修改...

計數排序(線性時間排序) 演算法導論

之前的排序都是通過比較得到的,即比較排序 在排序的最終結果中,各元素的次序依賴與它們之間的比較。而時間複雜度最好的也是o nlgn 接下來說乙個未經比較的排序,而複雜度則是線性的。計數排序 假設n個輸入元素的每乙個都是在0 k區間內的乙個整數,其中k為某個整數。當k o n 時,排序的執行時間為o ...