题目:
假设班上有5个同学,这学期期末考试,这5个同学分别考了5分、3分、5分、2分、8分,满分是10分。接下来将分数从大到小排序,排序后是8 5 5 3 2。
实现:
//**【简单桶排序】**//
void simpleBarrelSort() {
int a[11], i, j, t;
for (i = 0; i < 11; ++i) {
a[i] = 0;
}
for (i = 1; i <= 5; ++i) {
scanf("%d", &t);
a[t]++;
}
//从大到小输出
for (i = 10; i >= 0; --i) {
for (j = 0; j < a[i]; ++j) {
printf("%d\t", i);
}
}
printf("\n");
//从小到大输出
for (i = 0; i < 11; ++i) {
for (j = 0; j < a[i]; ++j) {
printf("%d\t", i);
}
}
}
时间复杂度O(m+n).
这个算法非常浪费内存空间。
算法思想:
这个算法就好比有11个桶,编号从 0~10 。每出现一个数,就在对应的编号的桶中放一个小旗子,最后只要数数每个桶中有几个小旗子就行了。例如 2号桶中有 1 个小旗子,表示 2 出现了一次;3号桶中有个 1 个小旗子,表示 3 出现了一次; 5号桶中有 2 个小旗子,表示 5 出现了两次; 8号桶中有 1 个小旗子,表示 8 出现了一次。
参考啊哈磊的《啊哈!算法》一书。