首页 > 代码库 > 桶排序

桶排序

 1 //桶排序思想
 2 //假如要排序的是数字是 2 4 5 5 5 8 8 9 1 1
 3 #include<stdio.h>
 4 #define length 10
 5 int main()
 6 {
 7     //数组元素值全部初始化为0
 8     int array[length]={0};
 9     int i,j;
10     int n;
11     for(i=0;i<length;i++)
12     {
13         scanf("%d",&n);
14         array[n]++;
15     }
16     for (i = 0; i < length; i++)
17     {
18         for(j=0;j<array[i];j++)
19             printf("%d ",i);
20     }
21 
22     return 0;
23 }

假如上面是运动会某个时刻的金牌数,这样子无法区分到底是哪个国家。

并且排序满足:1.按照金牌数 2.按照输入顺序

我们可以设置一个二维数组,把每行数组看做一个队列,先输入的先进队,输出自然是遵循先进先出的原则。

// Ba 2 Da 4 Ea 5 Eb 5 Ec 5 Ha 8 Hb 8 Ia 9 Aa 1 Ab 1
#include<stdio.h>
#define length 10

struct node
{
    char country[6];   //国家
    int count;             //金牌数
};
int main()
{
    int i,j,n;
    int array[10][10]={0};
    int index[10]={0};       //存储每行队列(数组)内元素个数
    struct node ary[length]={
        {"Ba",2},{"Da",4},{"Ea",5},{"Eb",5},
        {"Ec",5},{"Ha",8},{"Hb",8},{"Ia",9},
        {"Aa",1},{"Ab",1}};
    for(i=0;i<length;i++)
    {
        n=ary[i].count;            //桶子编号
        array[n][index[n]]=i;    //存储结构体数组索引
        index[n]++;
    }
    for(i=0;i<length;i++)
    {
        for(j=0;j<index[i];j++)
        {
            printf("%s %d\n",ary[array[i][j]].country,ary[array[i][j]].count);
        }
    }
}

结果:

如果感觉代码不好理解,看图: