您的位置:首页 > 其它

常见排序算法——桶排序(箱子排序)bucket Sort

2017-05-08 22:53 316 查看
桶排序是一个经典的排序算法,特点是速度快,算法复杂度为O(n),且是稳排,当然也是最耗空间的一种算法。

例如:

1)排序一组数[7,3,19,11,6,8,1,15]

最大数是19,那首先创建20个空桶,接着就是把这些数依次放进对应的桶中;



2)有重复的元素,如[7,3,9,11,6,3,7,14],这时候应该保证每个桶能放入多个元素,即最终保证排序稳定性,所以我选择用链表来存储每个桶中的元素,没有元素则为空链表。



以下代码使用了我学习时写的单向链表chain.h,类似于STL中forward_list。

/**************************************
*函数名称:bucketSort
*参数说明:theChain 一个保存待排序的所有元素的单向链表
range 数组中的最大数
*  类说明:chain.h是个单向链表,前面学习线性表的时候创建
包含size(),empty(),get(index),erase(index),insert(index,element)
等成员函数
***************************************/
#include<iostream>
#include"chain.h"
using namespace std;

void bucketSort(chain<int> &theChain, int range)
{
//初始化桶
chain<int> *bucket = new chain<int>[range + 1];
int numberOfElements = theChain.size();

//从链表中一次取下元素,分别插入到对应的桶中
for (int i = 0; i < numberOfElements; ++i)
{
int x = theChain.get(0);
theChain.erase(0);
bucket[x].insert(0, x);
}

//依次从每个桶中取出元素插入到链表中
for(int j = range; j >= 0; --j)
while (!bucket[j].empty())
{
int y = bucket[j].get(0);
bucket[j].erase(0);
theChain.insert(0, y);
}
delete[] bucket;
}

int main()
{
chain<int> c;
for (int i = 0; i < 10; ++i)
c.insert(0, i + 1);
cout << c << endl;  //10,9,8,7,6,5,4,3,2,1

bucketSort(c, 10);  //1,2,3,4,5,6,7,8,9,10
cout << c << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐