桶排序
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); } } }
结果:
如果感觉代码不好理解,看图: