版权声明:[email protected] https://blog.csdn.net/lytwy123/article/details/84676940
1.描述
什么是桶排序呢,比如你需要输入的数据范围为0-10,需要排序的数的数据范围,那么只需要定义一个大小为11的数组存储你需要的数即可,比如你要排10 6 0 1 1等5个数,那么你就将他们分别放进对应下标的位置
即数组a,
a[0]存了1个0,a[1]存了2个1,a[6]存了1个6,a[10]存了1个10.
然后对这些数排序即可,每一个元素相当于一个桶。
有点抽象
2.算法分析
一开始将元素初始化为0,然后我们将需要排序的数按照数组下标依次存入对应数组元素中,就像上图,我们排序0,1,1,6,10所以除了a[0],a[1],a[6],a[10]的元素不为0以外,其他的元素都为0,而下标存储的值就是你需要排序的数的个数,只需要依次输出即可。
桶排序是一个时间效率非常高的排序算法,比如你要排序n个数(即有n个桶),m为你需要排序的个数。
那么时间复杂度为O(m+n)基本上是非常小的。
但是时间快了,空间也就大了,在排序比较大的数,所需要开辟数组就越大。
3.代码分析:
#include <iostream>
#include <cstdio>
using namespace std;
int num[1001];
int main(){
int n , s;
scanf("%d", &n);
for (int i = 0 ; i < n ; i++){
scanf("%d", &s);
num[s]++; //进行计数,对编号为s的桶放入一个棋子
}
for (int i = 0 ; i < 1001 ; i++){
for (int j = 1 ; j <= num[i] ; j++){ //为什么从1开始,因为不需要排序的数的下标对应元素都为0
printf("%d ", i);
}
}
printf("\n");
return 0;
}