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

Posted 寸金课堂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了桶排序——最快最简单的排序相关的知识,希望对你有一定的参考价值。

从今天起,将开始推出算法的系列教程,算法语言采用c++,争取用简洁明了的语言和程序,让大家都能看懂,学会。

开始讲解桶排序前,我们先来了解一下排序。没错,这个排序和你想象的排序并无出入,排序在我们生活中随处可见:站队要按大小个排序、看电影买票要按先来后到的时间排序、还有考试名次按分数高低排序(你可能最不愿意看到的排序)、网上购物的时候还可以根据需要自定义价格、销量等排序。

既然考试成绩是我们最不喜欢的排序,那我们就以这个来做为桶排序讲解的例子(ps:忒坏了!)先来看看我们的题目:

期末考试完了,老师要将学生的成绩从高到低排序,班里一共有六名同学,考试成绩分别是 3,5,2,9,8,3(为什么考得这么惨桶排序——最快最简单的排序,排序后是9,8,5,3,3,2,下面就来看一下什么是桶排序,以及怎样用它进行排序。(看之前可以自己先思考一下有什么办法来排)


桶排序的定义我们暂且不看,只看这道题,满分既然是十分制(难怪),所以我们至少需要十一个空桶(如果满分是100分,那就至少需要101个桶了),桶的编号从0到10,首先依次循环所有学生的成绩,分数是多少,就将对应编号的桶里的放一面红旗。然后将所有非空桶的编号从高到低依次输出,有几面红旗就输出几次。


如果看着有点晕,可以看下面的图示:

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

在程序中,我们用数组代替桶,请试着将上面的排序逻辑和下面的程序对应:

#include<iostream>using namespace std;
int main(){ //定义桶数组,i,j用于循环 int tong[11],i,j,score; //初始化桶为0 for(i=0;i<=10;i++){ tong[i] = 0; } cout<<"请输入学生成绩:"<<endl; //循环读入6个学生成绩 for(i=0;i<6;i++){ cin>>score; //将对应分数的桶的值增加1 tong[score]++; } cout<<"排序后输出:"<<endl; //从大到小排列输出 for(i=10;i>=0;i--){ //桶里有几个数就输出几次 for(j=1;j<=tong[i];j++){ cout<<i<<" "; } } cout<<endl; system("pause"); return 0; }

程序运行结果:

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

如果你想从小到大输出,只需要修改第20行循环的语句为:

for(i=0;i<=10;i++){

桶排序最大的问题就是浪费空间,比如要对10个数进行排序,这10个数是0——1000000之间的正整数,虽然要排序的数很少,但却需要开1000001的数组空间。

最后再来看下算法复杂度,代码中第 8行的循环一共循环了 m次(m为桶的个数), 第 13行的代码循环了 n次(n为待排序数的个数),第 20行和第 22行一共循环了 m+n次。 所以整个排序算法一共执行了 m+n+m+n次。我们用大写字母 O来表示时间复杂度,因此该算法的时间复杂度是 O(m+n+m+n)即 O(2*(m+n))。通常时间复杂度可以忽略较小的常数,所以最终桶排序的时间复杂度为 O(m+n)。还有一点,在表示时间复杂度的时候,n和 m 通常用大写字母即 O(M+N)。 

当然,这只是桶排序的一个简洁用法,并不算真正意义上的桶排序。真正的桶排序要比这个程序复杂的多,我们留待以后讨论。桶排序从 1956 年就开始被使用,该算法的基本思想是由 E.J.Issac和 R.C.Singleton提出来的。

顺便打下广告

我们开设有机器人编程、青少年编程动画设计欢迎来电咨询!

寸金课堂——让学习成为一件有趣的事

长按二维码微信详询


以上是关于桶排序——最快最简单的排序的主要内容,如果未能解决你的问题,请参考以下文章

最快最简单的排序算法:桶排序

桶排序算法:最快最简单的排序算法

啊哈!算法最快最简单的排序:桶排序

世界上最快最简单的排序——桶排序

排序算法一:桶排序

一大波数正在靠近——排序