簡介:用於整數排序,不同於比較排序,計數排序假設輸入元素的大小在0到k之間,通過計算比 i 小的數的個數而確定 i 的位置。
思路:計算所排序的陣列中,比元素 i 小的數的個數 n,如果n=5,那麼 i 就應該排列在第6個位置上,通過計算每乙個元素的 n 值,我們就能知道每乙個元素的位置,因為元素有可能重複,所以我們還有記錄重複的數的個數以免把重複的數都重複放置到同乙個位置上(當然如果你想去掉重複的數時,可以省略這一步)。
演算法分析
時間複雜度:θ(n+k)
空間複雜度:θ(2n+k)
穩定性:穩定演算法
是否是原址排序:否
**實現
普通版:這個版本假設輸入的資料在[0,k]之間,需要給方法輸入k的值,會保留重複的資料。
1 #include2 #include3using
std::cout;
4using
std::endl;
5using
std::vector;
6 vector counter_sort(vector v,int k)
18return
out;19}
20int
main(), 9
))22 cout << n << "";
23 cout <24 vector a = ;
25 a.resize(10, 1
);26
print(a);
27return0;
28 }
去重複資料版:這個版本假設輸入的資料在[0,k]之間,需要給方法輸入k的值,並且會自動去掉重複的資料。
1 vector counter_sort(vector v, intk)14
return
out;
15 }
範圍擴大版:這個版本假設輸入的資料在[-∞,k]之間,需要給方法輸入k的值,會保留重複的資料。
1 vector counter_sort(vector v, int a, intk)//
將[-∞,k]轉換到[0,k2]的域裡,再用普通的版本去執行
78 vector count, out
;9 count.resize(k + 1, 0
);10
out.resize(v.size(), 0
);11
for (int
n : v)
12 ++count[n];
13for (int i = 1; i < count.size(); ++i)
14 count[i] = count[i] + count[i - 1
];15
for (int
n : v)
19if (0 !=a)
20for (int& n : out)24
return
out;
25 }
自動確定k值版:這個版本會自動確定排序範圍,會保留重複的資料。
1 vector counter_sort(vectorv)14if (0 !=a)
1920 vector count, out
;21 count.resize(k + 1, 0
);22
out.resize(v.size(), 0
);23
for (int
n : v)
24 ++count[n];
25for (int i = 1; i < count.size(); ++i)
26 count[i] = count[i] + count[i - 1
];27
for (int
n : v)
31if (0 !=a)
32for (int& n : out)36
return
out;
37 }
參考資料:《演算法導論 中文版》(英文版第三版)(美)thomash.cormen,charlese.leiserson,ronaldl.rivest,cliffordstein 著;王剛,鄒恒明,殷建平,王巨集志等譯
計數排序及其擴充套件思路
1 原理和 以及時間複雜度分析 1.計數排序的原理 設被排序的陣列為a,排序後儲存到b,c為臨時陣列。所謂計數,首先是通過乙個陣列c i 計算大小等於i的元素個數,此過程只需要一次迴圈遍歷就可以 在此基礎上,計算小於或者等於i的元素個數,也是一重迴圈就完成。下一步是關鍵 逆序迴圈,從length a...
計數排序及其擴充套件思路
計數排序的基本思想是 統計乙個數序列中小於某個元素a的個數為n,則直接把該元素a放到第n 1個位置上。當然當過有幾個元素相同時要做適當的調整,因為不能把所有的元素放到同乙個位置上。計數排序假設輸入的元素都是0到k之間的整數。1 原理和 以及時間複雜度分析 1.計數排序的原理 設被排序的陣列為a,排序...
演算法 排序 計數排序
計數排序不是基於比較的排序演算法,其核心在於將輸入的資料值轉化為鍵儲存在額外開闢的陣列空間中。作為一種線性時間複雜度的排序,計數排序要求輸入的資料必須是有確定範圍的整數。計數排序 counting sort 是一種穩定的排序演算法。計數排序使用乙個額外的陣列c,其中第i個元素是待排序陣列a中值等於i...