#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
//桶排序,时间快但是费空间
int main()
{
int book[1010];
int n, t;
cin >> n;
fill(book, book + 1010, 0);
for (int i = 0; i < n; i++)
{
cin >> t;
book[t]++;
}
// for (int i = n; i > 0; i--)err
// 这里是从最大的数字开始遍历,而不是多少个数字!
for(int i=1000;i>=0;i--)//从最大的数开始判断出现次数
for (int j = 0; j < book[i]; j++)
cout << i << " ";
return 0;
}
//c语言+注释
#include <stdio.h>
int main()
{
int book[1001], i, j, t, n;
for (i = 0; i <= 1000; i++)
book[i] = 0;
scanf("%d", &n);//输入一个数n,表示接下来有n个数
for (i = 1; i <= n; i++)//循环读入n个数,并进行桶排序
{
scanf("%d", &t); //把每一个数读到变量t中
book[t]++; //进行计数,对编号为t的桶放一个小旗子
}
for (i = 1000; i >= 0; i--) //依次判断编号1000~0的桶
for (j = 1; j <= book[i]; j++) //出现了几次就将桶的编号打印几次
printf("%d ", i);
getchar(); getchar();
return 0;
}
冒泡核心算法
//冒泡排序,不过时间慢
//冒泡排序的核心部分
for (i = 1; i <= n - 1; i++) //n个数排序,只用进行n-1趟
{
for (j = 1; j <= n - i; j++) //从第1位开始比较直到最后一个尚未归位的数,想一想为什么到n - i就可以了。
{
if (a[j] < a[j + 1]) //比较大小并交换
{
t = a[j]; a[j] = a[j + 1]; a[j + 1] = t;
}
}
}
//总结:假设为倒序。
//每次都是从第一位开始一直比对前后两个数,交换,一直传递到最后,一定能够确定最小的的数
//所以每一次都交换,把相对小的数放在最后面,完成排序。
//而已经放好的数,就不必要再判断了,所以是n-i;