最快最简单的排序——桶排序

 在我们日常生活中经常会用到排序,像站队时要按照身高进行排序,考试成绩单要按照分数排序,购物按照价格排序等等。可以说排序是无处不在的。下面给大家通过一个实例来给大家讲一下最简单最容易的桶排序。

 最简单最快的桶排序,我们可以把数组想象成一个又一个桶,每一个桶只能装一个特定的数字,桶里有几个数字我们就打印几次,遇到空桶就跳过。排序的过程就是遍历数组的过程,相当于我们不用考虑排序,只需要考虑打印就好了就像下面这个图描述的一样。我们建立一个大小为6的一维数组,对2,4,3,6,1,2进行排序,只需要把这些数放入桶中,然后从前向后打印就好了。

     如果大家还是有点懵的话那就看一下下面这个例题给大家再详细讲解一下

      题:大明的班里有10个人,他们班进行了数学测验,满分为100分。现在我们知道班上的10个人成绩分别为60,58,99,48,87,64,68,84,76,81。现在我们要把他们的成绩进行从小到大排序。大家看到这里可以先停一下,自己想想在往下看。

      思路:我们可以申请一个大小为101的一维数组,这里我们把这个一维数组写成a[101],(为什么是101?因为我们满分是100,0分-100分总共有101个数字,我们的数组大小就是排序的范围),然后我们把a[0]~a[100]都初始化成0,表示目前有0个人得过这样的分。然后把数据读入数组中,分数是多少分我们就把让对应的下标的内容+1。就比如说第一个人分数是60,我们让a[60]++,这时候a[60]的值由0变成了1,表示有1个人得了60分。如果再有人得60分那么a[60]就变成了2。以此类推,我们把所有数据读入后只需打印数组中值不为0的数字,对应下标存放的值为几我们就打印几遍。这样一来大家是不是就理解清楚了,下面我给大家写一下代码,当然代码不统一,思想对了就行。

#include<stdio.h>
int main()
{
	int a[101]={0};//定义大小为101数组并且初始化为0
	int n;
	int i;
	for(int i=0;i<10;i++)//读入10个同学的数据
	{
		scanf("%d",&n);
		a[n]++;//统计每个分值的个数
	}
	for(i=0;i<=100;i++)//遍历数组找出值不为0的打印
	{
		for(int j=0;j<a[i];j++)//分值出现几次就打印几次
		{
			printf("%d ",i);
		}
	}
}

       最后我们再来讨论一下桶排序的时间复杂度以及使用与什么场合和优缺点问题

        时间复杂度:因为时间复杂度可以忽略较小的常数,所以我们只需要考虑第12,14行循环了m+n次,我们用O表示时间复杂度,所以桶排序的时间复杂度为O(M+N)。

       优点:其实优点我们在标题就说了,最快最简单,简单体现在很容易理解,快体现在时间复杂度低。比我们后面要学的所有排序还要快,假如我们的计算机每秒钟运行10亿次,那么桶排序对1亿个数排序只需要0.1秒。而冒泡排序时间复杂度O(n^2)则需要花费1千万秒,相当于115天。哪怕是快速排序也需要大约1.7秒。

      缺点:既然桶排序那么厉害为什么不经常用呢?因为它非常浪费空间,就比如我们对1,548799947914,4这三个数字进行排序,如果我们要使用桶排序就要构建548799947914个桶,也就是要int a[548799947914],这是很浪费空间的,而且计算机也不允许这样做,还有就是如果排序过程出现小数我们就没法处理,所以虽然快但是适用性差一点。

     适用场合:相信大家看了缺点就知道只要是待排序数字范围不大并且没有小数我们就可以用桶排序。

      下一次给大家讲一个实用性更高一点的冒泡排序。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值