vlambda博客
学习文章列表

C语言实现简化版桶排序

问题:编写一个程序,让计算机随机读入指定数量的指定范围内的数然后将这些数从大到小输出。

举例:现在共有 5 8 5 3 1 五个数,编写一个程序,使这五个数从大到小排序

解决:这里只需要借助一个一维数组就可以搞定。

首先申请一个大小为9的数组 int num[9],将 num[0]~num[9] 全部初始化为0,表示这些数还没有输入。例如 num[2]=0 就是说目前还没有出现 2 这个数,同理 num[5]=0 就是说还没有出现 5 这个数。

下面开始输入数据,第一个数是 5 ,那么对应的 num[5] 就要在原来的基础上自增 1,表示 5 这个数出现了一次;以此类推,输入剩下的四个数,也就是对应的 num[n] 在原来基础上自增 1.

数据输入完毕后,会发现数组的值发生了改变

因为 5 出现了两次,所以对应的 num[5] 的值就变为 2 ,同理 num[8],num[3],num[1] 的值也发生了相应改变。

输入完毕后,输出这些数,就实现了数据从大到小输出的问题。

#include <stdio.h>
int main(){
int num[9],i,t,j;

for(i=0;i<9;i++){
num[i] = 0;
}
for(i=0;i<5;i++){
scanf("%d",&t);
num[t]++;
}
for(i=9;i>=1;i--){
for(j=1;j<=num[i];j++){
printf("%4d",i);
}
}

getchar();
return 0;
}

以上的排序方法就是简单的桶排序,实现原理就是创建对应数量的桶,每个桶的编号就是下标,每出现一个数,就在对应编号的桶中放一个小旗,最后只需要数每个桶中有几个旗就ok了。

简化版桶排序并不是真正的排序算法,因为它的致命问题就是浪费空间。为此,需要学习冒泡排序,节省空间。