第六章 算法秘籍之桶排序

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>


以上是关于第六章 算法秘籍之桶排序的主要内容,如果未能解决你的问题,请参考以下文章

排序算法之桶排序

算法:排序之桶排序和基数排序

十大排序算法之桶排序

排序算法之桶排序

经典算法之桶排序

排序算法专题之桶排序