No.1.1 排序 - 桶排序


一、简单的桶排序:非常浪费空间!而且限制较多!时间复杂度O(N+M)

EG1. 编写一段程序,让计算机随机读入5 个数然后将这5 个数从大到小输出?

#include   //引入头文件,包含很多常用函数,如printf
int main()      // int表示返回值,无需返回值用void
{
  int a[11],i,j,t;   //变量必须先申明,后使用

  for(i=0;i<=10;i++)  //根据输入值得范围,初始化桶大小
    a[i]=0;

  for(i=1;i<=5;i++)  //循环读入5个数值
  {
    scanf("%d",&t);  // a[t] = t
    a[t]++;
  }


  for(i=0;i<=10;i++)  // *_* //
    for(j=1;j<=a[i];j++)  // a[i] >= 1, 所以此处只输出非空桶
      printf("%d ",i);

  //getchar();getchar();  //这里的getchar();用来暂停程序,以便查看程序输出的内容,也可以用system("pause");等来代替
  return 0;
}

很显然,上述代码实现的是从小到大的输出;如果要完成从大到小的输出,// *_* //  -> for (i=10;i>=0;i--)

注意C语言的语法:

  1.变量必须先申明,后使用

  2.每一条执行语句,以 “;” 结尾;循环控制语句不算执行语句,故无需以 “;” 结尾

  3.多条执行语句在同一个控制块内,最好以 { } 修饰

  4.return 返回值要与 main 的声明相对应

  5.最重要的是,程序必须放在project里面,如果单独以文件方式运行,会出现莫名其妙的问题

EG2. 尝试一下输入 n 个0~1000 之间的整数,将它们从大到小排序。

# include

int main()

  int book[1001], i, j, n, t;

  for (i=0; i<=1000; i++)

    book[i] = 0;

  scanf("%d", &n);

  for (i=1; i<=n; i++)

  { 

      scanf("%d", &t);

    book[t]++;   

  for (i = 1000; i>=0; i--)

    for (j=1;j<=book[i]; j++)

      printf("%d", i);

  getchar();

  return 0;

相关