在已知待排序的元素范围为0-k之间时,可使用计数排序。当k=O(n)时,此时运行时间为Θ(n)。思路是:记录对应元素出现的次数,则可以推算出改元素在排序后中的数组的下标。
void counting_sort(vector<int>& A, vector<int>& B, int k){
vector<int> C(k + 1, 0);
for (int i = 0; i < A.size(); i++)
C[A[i]]++;
for (int i = 1; i < C.size(); i++)
C[i] += C[i - 1];
for (int i = A.size() - 1; i >= 0; i--){
B[C[A[i]]-1] = A[i];
C[A[i]]--;
}
}
int main()
{
srand(time(0));
vector<int> nums(10);
for (int i = 0; i < nums.size(); i++){
nums[i] = rand() % 20;
}
for (auto val : nums)
cout << val << " ";
cout << endl;
vector<int> B(10);
counting_sort(nums, B, 20);
cout << "counting-sort: " << endl;
for (auto val : B)
cout << val << " ";
cout << endl;
return 0;
}