第六章 算法秘籍之桶排序
Posted 炎龙工作室
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第六章 算法秘籍之桶排序相关的知识,希望对你有一定的参考价值。
第六章 算法秘籍之桶排序
远航回到宿舍,拿起了《算法秘籍之排序大法》看了起来。里面介绍了四种常见的排序方法,桶排序、冒泡排序、插入排序、选择排序。
他首先看到的是最简单的排序方式——桶排序。
输入:5
4 3 8 4 6
输出:3 4 4 6 8
把设定的数组空间都看成是空桶。a[10]就是有编号从0到9的10个桶。设定桶里面存储的数字为0,作为空桶。
首先定义数组空间和变量:int a[10],n,tmp;
然后将所有桶清空,设置为0:
for(int i=0;i<10;i++){//将所有的桶清空设置为0
a[i]=0;
}
将桶清空为0的另一种简便方式:
memset(a,0,sizeof(a));//第一个a表示数组的名称,0表示要设置的数字,sizeof(a)表示总共有多少个桶。
循环接收n个输入的数字作为数组的下标(桶的编号):
scanf("%d",&n);
for(inti=0;i<n;i++){
scanf("%d",tmp);
a[tmp]++;
}
第一次输入的数字是4,tmp存储了数字4,a[tmp]++就表示a[4]桶加1,如图所示。
第二次输入的数字是3,tmp存储了数字3,a[tmp]++就表示a[3]桶加1,如图所示。
第三次输入的数字是8,tmp存储了数字8,a[tmp]++就表示a[8]桶加1,如图所示。
第四次输入的数字是4,tmp存储了数字4,a[tmp]++就表示a[4]桶再加1就变成了2,如图所示。
第五次输入的数字是6,tmp存储了数字6,a[tmp]++就表示a[6]桶加1,如图所示。
规律就是每次在输入数字相同的桶里加1。
完整的程序:
#include<stdio.h>
int a[10],n,tmp;
int main(){
for(inti=0;i<10;i++){//将所有的桶清空设置为0
a[i]=0;
}
scanf("%d",&n);//要使用n个桶
for(inti=0;i<n;i++){ //使用数组空间,注意n不要超过10啊!
scanf("%d",tmp);//接收输入的数字作为数组的下标
a[tmp]++;//等价于a[tmp]=a[tmp]+1,将桶里面的数字加1
}
for(i=0;i<10;i++){ //这里结束一定是最后一个桶的编号
while(a[i]>0){ //为啥用while,桶里面有大于1的数字,说明有多个相同的数字
printf("%d ",i);//输出的是桶的编号,中间加了空格。
a[i]--; //将桶里面存储多于1的,每输出1个数减1次。
}
}
return 0;
}
上面的输出方式破坏了桶里的数量,还有一种不用减的方式:
for(i=0;i<10;i++){
for(j=0;j<a[i];j++){//a[i]里面存储了几个,就循环输出几次
printf("%d",i);
}
}
注意使用memset,要在头文件里加入:
#include<string.h>
以上是关于第六章 算法秘籍之桶排序的主要内容,如果未能解决你的问题,请参考以下文章