上榜理由:
如果没见过这种排序题,可能首先想到的就是常用的排序算法,比如快速排序,归并排序,那如果输入的n足够大,时间复杂度肯定比较高。其实题目0-1000的范围是一个题眼,所以一定有更优的排序算法:这里用到了桶排序!
回顾经典排序算法有
- 冒泡排序(Bubble Sort)
- 插入排序(Insertion Sort)
- 希尔排序(Shell Sort)
- 选择排序(Selection Sort)
- 快速排序(Quick Sort)
- 归并排序(Merge Sort)
- 堆排序(Heap Sort)
- 计数排序(Counting Sort)
- 桶排序(Bucket Sort)
思路就是:
首先,0-1000的值域,创建1001个桶,每个桶都对应一个index,里面放一个初始值count=0,表示大小是index的数出现的个数。
然后遍历n个数,就把这1001个桶里的count更新一次,
接着再根据要求从大到小,或者从下到大遍历1001个桶,如果count>0,表示出现过count,就打印count个对应桶index的值,
最后,就完成了排序算法输出!
//bucket_sort.cpp
#include <stdio.h>
#include <cstring>
int main()
{
int bucket[1001],i,j,t,n;
memset(bucket,0,sizeof bucket);
printf("please enter total number = \n");
scanf("%d",&n);//输入一个数n,表示接下来有n个数
printf("now please enter the data\n");
for(i=1;i<=n;i++)//循环读入n个数,并进行桶排序
{
scanf("%d",&t); //把每一个数读到变量t中
bucket[t]++; //进行计数,对编号为t的桶放一个小旗子
}
printf("sort data is: \n");
for(i=1000;i>=0;i--) //依次判断编号1000~0的桶
for(j=1;j<=bucket[i];j++) //出现了几次就将桶的编号打印几次
printf("%d ",i);
printf("\n");
return 0;
}
附个编译代码和输出测试
gcc -o test bucket_sort.cpp
./test