最快最简单的排序——桶排序
1、简单的桶排序
《啊哈!算法》第一章第一节,讲的是简单的桶排序。当我看完相关知识以及例题的时候,觉得这种桶排序在我的生活中有很多缩影。例如我可爱的女儿贝壳,她总会把指定的玩具放到它应该去的地方;又比如小时候选取班干部投票的时候,我们会把含有候选人名字的票数以“正”字的记录方式,计票到每名候选人的名下.…当然这只是最简单的桶排序,如何用C++实现一个简单的桶排序呢?我们来搞一下!
2、例题
贝壳班上只有5个同学,他们的考试成绩分别为5,3,5,2,8分(10分制),现在我们要用代码进行一个排序,使得排序后的结构为8 5 5 3 2。Just Do It!
这里我们可以分析一下问题:
①桶是什么?
②要把什么放到桶里?
③有多少个桶?
我们来看图!
我们要做的是按照同学的得分,把每名同学放到对应桶子里,这样我们就可以得到上面问题的答案:
①桶是所有可能的分数的分布 ;
②把不同得分的同学放到对应桶子里;
③根据10分制来说,一共会用11个桶
3、C++代码
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
int main()
{
int a[11]; // 定义11个桶
int t;
for (int i = 0; i <= 10; i++)
{
a[i] = 0; //初始化为0
}
cout << "请输入5个人的分数" << endl;
for (int i = 0; i < 5; i++)
{
cin >> t;
if (t > 10)
{
cout << "分数输入有误!" << endl;
return 0;
}
// 行进计数
a[t]++;
}
cout << "排序结果为:" ;
// 倒叙遍历桶
for (int i = 10; i > 0; i--)
{
// 当桶个数不为0的时候,我们输出桶的编号i,当桶中数量a[i]>1时,也可以重复输出i
for (int j = 1; j <= a[i]; j++)
{
cout << i << " ";
}
}
cout << endl;
system("pause");
return 0;
}
4、关于时间复杂度的分析
代码中总共出现了两个独立循环和一个嵌套循环。第一个独立循环执行了n次(n代表桶的个数),第二个循环一共执行了m次(m代表放入桶中的样本数量),第三个嵌套循环一共执行了m+n次。整个算法的时间复杂度是O(2(m+n)),即O(M+N) 。但是这是简化版的桶排序(书上是这么告诉我的),同样书中给我抛出了一个疑问!我怎么知道哪个是贝壳的成绩?有道理,考的好要奖励,考的不好可能就是小柳条炒肉了!应该会有解决方法,期待后续的学习!