(今天开始学习啊哈算法,这本算法数真的挺好的,不管处于什么阶段的算法学习都可以借鉴,我就把自己的学习心得同大家分享分享,坚持每日更新,加油!下面我附上这本书的图片,感兴趣的朋友可以去买一本看看哈)
第一节 桶排序算法(简化版)
- 生活中到处都是被排序的东西,最为常见的就是数字了,桶排序算法就是借用一个一位数组去解决排序问题。(仔细想想哦)
- 仔细想想其实排序就是把一堆数字放在他应该存在的地方,那么在一位数组里,我们只需要把自己需要排序的数放在他所对应的位置就行了。例如:1我们就可以把它放在a[1]这个位置
- 位置解决了,那么假如一个需要排序的数字出现了多次呢?我们可以用数字来表示其出现的次数,例如:1这个数字出现了2次,那么我们就可以让a[1]=2;然后循环时输出两次,就可以解决这个问题了。文字叙述可能有点抽象,我们用图片:
通过图片,我们可以看出,未排序之前,所有数的位置为0;哪一个数出现就将哪一个数的位置的数字++; - 我们来做一个简单地小测试,将5,5,5,2,8这五个数由小到大排序:代码:
#include <stdio.h>
int main()
{
int a[11], i, j, t;
for (i = 0; i <=10; i++)
{
a[i] = 0; //将每个位置初始化为0
}
for (i = 1; i <=5; i++) //循环读入5个数
{
printf("请输入第%d个数:", i);
scanf("%d", &t);
printf("\n");
a[t]++;
}
for(i=0;i<=10;i++)
for (j = 1; j <= a[i]; j++) //出现几次就打印机次
{
printf("%d", i);
}
return 0;
}
按照上述想法写成代码得到测试结果:
如果想要由大到小输出,仅需将代码循环改成:for(i=10;i>=0;i–)即可。
- 测试完了0~10,我们来试试0 ~ 1000的数排序,我们需要定义一个book[1001]的数组:
#include <stdio.h>
int main()
{
int book[1001], i, j, t,n;
int f = 1;
for (i = 0; i <=1000; i++)
{
book[i] = 0; //将每个位置初始化为0
}
while (f == 1)
{
printf("请输入需要排序的个数:");
scanf("%d", &n);
printf("\n");
if (n <= 1000)
{
break;
}
else
{
f = 1;
}
}
for (i = 1; i <=n; i++) //循环读入n个数
{
printf("请输入第%d个数:", i);
scanf("%d", &t);
printf("\n");
book[t]++;
}
printf("由小到大为:");
for(i=0;i<=1000;i++)
for (j = 1; j <= book[i]; j++) //出现几次就打印机次
{
printf("%d", i);
printf(",");
}
return 0;
}
结果: