计数排序算法思想
以往的排序算法中,各个元素的位置基于元素直接的比较,这类排序称为比较排序。任意一个比较排序算法在最坏情况下,都需要做
O(nlgn)
次的比较。计数排序是基于非排序的思想的,计数排序假设n个输入元素中的每一个都是介于0到k之间的整数。
计数排序的思想是对每一个输入元素x,确定出小于x的元素个数,有了这一信息,就可以把x直接放在它在最终输出数组的位置上,例如,如果有17个元素小于x,则x就是属于第18个输出位置。当几个元素相同是,方案要略作修改。
计数排序是稳定的。
计数排序的时间复杂度为O(n),空间复杂度为O(M),这里M为桶的数量
代码
要求:
对于一个int数组,请编写一个计数排序算法,对数组元素排序。
给定一个int数组A及数组的大小n,请返回排序后的数组。
测试样例:
[1,2,3,5,2,3],6
[1,2,2,3,3,5]
程序:
class CountingSort {
public:
int* countingSort(int* A, int n) {
// write code here
if(n<2){
return A;
}
int min = A[0], max = A[0];
for(int i=1; i<n; i++){
if(max<A[i]){
max = A[i];
}
if(min>A[i]){
min = A[i];
}
}
int* bucket = new int[max-min+1];
for(int i=0; i<max-min+1; i++){
bucket[i]=0;
}
for(int i=0; i<n; i++){
bucket[A[i]-min]++;
}
int index=0;
for(int i=0; i<max-min+1; i++){
for(int j=0; j<bucket[i]; j++){
A[index++]=i+min;
}
}
return A;
}
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。