計數排序【代碼】

任何比較排序(歸併排序,插入排序等等)的時間複雜度在最壞的狀況下都須要作Ω(n * lgn)次比較,而這裏的的計數排序因爲它不是基於比較排序的思路,因此它的複雜度不收這個限制,它的時間複雜度爲Θ(n),爲線性時間。同時,計數排序一個重要的性質就是它是穩定的,也就是說,對於兩個相同的數來講,在輸入數組中先出現的,在輸出數組中也位於前面。ios

詳細知識參考《算法導論》P109算法

----------------------------------------------------------代碼以下------------------------------------------------------------數組

 1 // 計數排序.cpp: 定義控制檯應用程序的入口點。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include <iostream>
 6 #include <vector>
 7 
 8 using namespace std;
 9 
10 int COUNTING_SORT(vector<int> &A,vector<int> &B,int k)//A爲輸入數組,B爲輸出數組,A中放入元素都是在[0,k]之間的,當k = O(n)時,算法的時間複雜度是線性時間
11 {
12     int *C = new int[k + 1]{0};//C[0..k]提供臨時存儲空間
13     for (int i = 0; i < A.size(); i++)
14     {
15         if (!(A[i] >= 0 && A[i] <= k))
16         {
17             cout << "輸入數組中的元素有不在[ 0," << k << " ]之間的!";
18             delete C;
19             return 0;
20         }
21     }
22 
23     for (int i = 0; i < A.size(); i++)
24         C[A[i]] ++;
25     //如今C[i]的值表示A中值等於i的元素的個數
26 
27     for (int i = 1; i <= k; i++)
28         C[i] += C[i - 1];
29     //如今C[i]的值表示A中值小於或者等於i的元素的個數
30 
31     for (int i = A.size() - 1; i >= 0; i--)
32     {
33         B[C[A[i]]-1] = A[i];
34         C[A[i]]--;
35     }
36     delete C;
37     return 0;
38 }
39 
40 
41 int main()
42 {
43     vector<int> A = {2,5,3,0,2,3,0,3};
44     for (auto c : A)
45         cout << c << ends;
46     cout << endl;
47 
48     vector<int> B(8,0);
49     COUNTING_SORT(A, B, 5);
50     for (auto c : B)
51         cout << c << ends;
52     cout << endl;
53     return 0;
54 }

運行結果以下:spa

相關文章
相關標籤/搜索