算法的思想,就是统计数列中小于某个数a的元素的个数,然后把a放到适当的位置,待排数据必须能够比较大小,应该是偏序的。在有限的待排序数据范围内,算法的时间复杂度是O(n+k),k是待排序数据的范围。
该算法的特点就是用空间换时间
#include <iostream>
using namespace std;
void countSort(int *data, int size) {
int i,j,count;
// 构造辅助数组,存储有序的数
int* data_p = (int*)malloc(sizeof(int)*size);
for(i=0; i<size; i++)
data_p[i] = 0;
// count
for(i=0; i<size; i++) {
count = 0;
for(j=0; j<size; j++) {
if(data[i] > data[j])
count++;
}
if(data_p[count] != 0) // 不等于0表示这个位置上已经有数据存储了
count++;
data_p[count] = data[i];
}
// 处理相同的值的情况
i = 0;
while (i<size) {
if(data_p[i] == 0)
data_p[i] = data_p[i-1];
i++;
}
for(i=0; i<size; i++)
data[i] = data_p[i];
free(data_p);
}
int main() {
int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};
int size = sizeof(a) / sizeof(a[0]);
countSort(a, size);
for(int i = 0; i < size; i++)
cout << a[i] << "\t";
return 0;
}