計數排序詳解


1.計數排序是一種非常快捷的穩定性強的排序方法,時間復雜度O(n+k),其中n為要排序的數的個數,k為要排序的數的組大值。計數排序對一定量的整數排序時候的速度非常快,一般快於其他排序算法。但計數排序局限性比較大,只限於對整數進行排序。計數排序是消耗空間發雜度來獲取快捷的排序方法,其空間發展度為O(K)同理K為要排序的最大值。

2.計數排序的基本思想為一組數在排序之前先統計這組數中其他數小於這個數的個數,則可以確定這個數的位置。例如要排序的數為 7 4 2 1 5 3 1 5;則比7小的有7個數,所有7應該在排序好的數列的第八位,同理3在第四位,對於重復的數字,1在1位和2位(暫且認為第一個1比第二個1小),5和1一樣位於6位和7位。

3.計數排序的實現辦法

  首先需要三個數組,第一個數組記錄A要排序的數列大小為n,第二個數組B要記錄比某個數小的其他數字的個數所以第二個數組的大小應當為K(數列中最大數的大小),第三個數組C為記錄排序好了的數列的數組,大小應當為n。

  接着需要確定數組最大值並確定B數組的大小。並對每個數由小到大的記錄數列中每個數的出現次數。因為是有小到大通過出現次數可以通過前面的所有數的出現次數來確定比這個數小的數的個數,從而確定其位置。

  對於重復的數,每排好一個數則對其位置數進行減減操作,以此對完成其余相同的數字進行排位。

 1 #include<iostream>
 2 #include<stdlib.h>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     int n;
 9     cin >> n;
10     int *a = new int[n];
11     int *c = new int[n];
12     memset(a, 0, n*sizeof(int));
13     memset(c, 0, n*sizeof(int));
14     int max = 0;
15     for (int i = 0; i < n; i++)
16     {
17         cin >> a[i];
18         max = a[i]>max ? a[i] : max;
19     }
20     int *b = new int[max+1];
21     memset(b, 0, (max+1)*sizeof(int));
22     for (int i = 0; i < n; i++)
23     {
24         b[a[i]]++;
25     }
26     for (int i = 1; i < max + 1; i++)
27     {
28         b[i] = b[i] + b[i - 1];
29     }
30     for (int i = 0; i < n; i++)
31     {
32         b[a[i]]--;
33         c[b[a[i]]] = a[i];
34     }
35     for (int i = 0; i < n; i++)
36         cout << c[i] << endl;
37     delete[]a;
38     delete[]b;
39     delete[]c;
40 
41     return 0;
42 }

運行結果;

10
2 1 3 4 2 5 6 1 8 11
1
1
2
2
3
4
5
6
8
11
請按任意鍵繼續. . .

 這就是傳說中的時間復雜度只有O(n)的排序算法;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM