計數排序是乙個類似於桶排序的排序演算法,其優勢是對已知數量範圍的陣列進行排序。它建立乙個長度為這個資料範圍的陣列c,c中每個元素記錄要排序陣列中對應記錄的出現個數。這個演算法於2023年由 harold h. seward 提出。
它的優勢在於在對一定範圍內的整數排序時,它的複雜度為ο(n+k)(其中k是整數的範圍),快於任何比較排序演算法。
這個演算法是為了學習字尾陣列才看的,剛看到的時候,覺得這個演算法有點、、、後來想想,當初乙個這個演算法的題,可是想了乙個多星期啊(當時什麼排序只會冒泡,連計數排序的思想都沒的、、),題目是這樣的:給你 0 - 100 之內的1000000個數,叫你排序之後輸出、、、
我們先設乙個陣列 t , t [7] = ; 再取乙個最大的值作為計數陣列的最大範圍,這裡最大值是 5, 所以計數後, cnt[1] = 4, cnt[2] = 1, cnt[3] = 1; cnt[4] = 0; cnt[5] = 1; 思想比較簡單、、於是就憤怒地貼上了**,如下:
int sort(int *t, int *cnt, int n, int k)
for (int i = 0; i < k; i++)
} } // t 表示需要排序的陣列, n 表示t 的大小, cnt 表示計數的陣列, k 表示t 中最大的數
看到一篇部落格(
鏈結)上有做過比較,0 - 100 之內的1000000個 隨機數排序,計數排序 比 快速排序 快 6 倍,所謂每種演算法都有各自的優勢嘛,每個人、、也是、、
應用:
前向星不需要像鄰接表那樣用指標指向下一條邊,還是挺方便的。但是,由於前向星初始化需要快排一遍,相對
鄰接表要慢許多。考慮到一般圖論題點數都不會很大,所以可以改為採用計數排序的思想對前向星進行排序。
一開始讀入時,先算出每個點出去的邊有多少條,然後計算出排序後每個點出去的第一條邊位置應在**,最後把全部邊掃一遍放到排序後應在的位置就好了。
這樣排序的話初始化的時間複雜度就降到了o(m),總體時間並不會遜色於
鄰接表。如果用快速排序,該演算法的複雜度為o(nlog^2n)。改用計數排序後,複雜度降為o(nlogn)。
歸併排序 小講
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。值得注意的是歸併排序是一種穩定的排序方法。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸...
python計數排序 Python 計數排序
1.python coding utf 8 def counting sort a,b,k 計數排序,偽碼如下 counting sort a,b,k 1 for i 0 to k 初始化儲存區的值 2 do c i 0 3 for j 1 to length a 為各值計數 4 do c a j ...
排序 計數排序
資料結構和演算法系列目錄 不斷更新 計數排序是一種線性時間的排序,它的時間複雜程度為o n 雖然是線性的時間複雜程度,但是它的空間複雜程度比較高,而且用之前需要有乙個硬性的前提。這個前提在後面給出,這裡先來簡單介紹一下計數排序。計數排序是先掃瞄一邊待排序陣列,並用乙個輔助陣列記錄待排序每個元素應該在...