桶排序简介

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值