計數排序詳解 O n

2021-08-07 02:56:59 字數 1620 閱讀 8280

計數排序基本思路為:

我們希望能線性的時間複雜度排序,如果乙個乙個比較,顯然是不實際的,書上也在決策樹模型中論證了,比較排序的情況為nlogn的複雜度。

既然不能乙個乙個比較,我們想到乙個辦法,就是如果我在排序的時候就知道他的位置,那不就是掃瞄一遍,把他放入他應該的位置不就可以了嘛。

要知道他的位置,我們只需要知道有多少不大於他不就可以了嗎?

以此為出發點,我們怎麼確定不大於他的個數呢?我們先來個約定,如果陣列中的元素都比較集中,都在[0, max]範圍內。我們開乙個max的空間b陣列,把b陣列下標對應的元素和要排序的a陣列下標對應起來。這樣不就可以知道不比他大的有多少個了嗎?我們只要把比他小的位置元素個數求和,就是不比他大的。例如:a=;我們開乙個大小為8的陣列b,把a[0] = 3 放入b[3]中,使b[3] = 0; 同理 b[5] = 1; b[7] = 2;其他我們都設定為-1,哈哈我們只需要遍歷一下b陣列,如果他有資料,就來出來,鐵定是當前最小的。如果要知道比a[2]小的數字有多少個,值只需要求出b[0] – b[6]的有資料的和就可以了。這個0(n)的速度不是蓋得。

思路就是這樣咯。但是要注意兩個數相同的情況a = ,這種情況就不可以咯,所以還是有點小技巧的。

處理小技巧:我們不把a的元素大小與b的下標一一對應,而是在b陣列對應處記錄該元素大小的個數。這不久解決了嗎。哈哈。例如a = 我們開大小為5的陣列b;記錄陣列a中元素值為0的個數為b[0] = 0, 記錄陣列a中元素個數為1的b[1] = 1,同理b[2] = 1, b[3] = 2, b[4] = 1;好了,這樣我們就知道比a4小的元素個數是多少了:count = b[0] + b[1] + b[2] + b[3] = 4;他就把a[4]的元素放在第4個位置。

還是截張書上的圖:

源**:

#include 

#include

//計數排序

int countsort(int* pdata, int nlen)

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

for (int i = 0; i < nlen; ++i)

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

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

int* psort = null; //儲存排序結果的指標

psort = (int*)malloc(sizeof(int) * nlen); //申請空間

for (int i = 0; i < nlen; ++i)

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

for (int i = 0; i < nlen; ++i)

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

free(pcout);

free(psort);

return1;}

int main()

; countsort(ndata, 10);

for (int i = 0; i < 10; ++i)

printf("\n");

system("pause");

return

0;}

計數排序演算法詳解

經典排序演算法 計數排序counting sort 注意與基數排序區分,這是兩個不同的排序 計數排序的過程類似小學選班幹部的過程,如某某人10票,作者9票,那某某人是班長,作者是副班長 大體分兩部分,第一部分是拉選票和投票,第二部分是根據你的票數入桶 看下具體的過程,一共需要三個陣列,分別是待排陣列...

排序演算法 詳解計數排序演算法

計數排序是一種非比較排序,它適用於範圍比較集中的資料處理。臨時開闢乙個陣列,通過統計資料的個數,將資料集中,再將這個陣列展開,實現排序的過程。時間複雜度 o max n,範圍 空間複雜度 o 範圍 首先就是c語言對範圍檢查不是很嚴格,我開闢陣列的時候,僅僅開闢了max min個大小,最後也沒有釋放空...

C 計數排序例項詳解

計數排序 計數排序是一種非比較的排序演算法 優勢 計數排序在對於一定範圍內的整數排序時,時間複雜度為o n k k為整數在範圍 快於任何比較排序演算法,因為基於比較的排序時間複雜度在理論上的上下限是o n log n 缺點 計數排序是一種犧牲空間換取時間的做法,並且當k足夠大時o k o n log...