上榜理由:
如果没见过这种排序题,可能首先想到的就是常用的排序算法,比如快速排序,归并排序,那如果输入的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