吊桶排序的排序速度很快,平均是O(n),能达到这么快的速度其中一个原因是它假设了输入值为范围是[0, 1)的小数。
Introduction to Algorithm这本书里面章8.4的算法,首先把原数组按照一定规律对照到每个吊桶(Bucket)里面,然后对每个Bucket排序,最后把这些Bucket串起来,就成为一个有序序列了。
下面是C++完整代码:
#include<iostream>
#include<vector>
#include<string>
#include<list>
#include<algorithm>
using namespace std;
template<typename C>
void bucketSort(typename C& ca) //难点
{
int n = ca.size();
int k = 0, i = 0;
vector<list<double> > vld(n); //难点
for(i=0; i<n; i++)
{
k = n * ca[i];
vld[k].push_back(ca[i]);
}
list<double> caTemp;
for(i = 0; i<n; i++)
{
if(!vld[i].empty())
{
vld[i].sort();
caTemp.merge(vld[i]);
//caTemp.insert(caTemp.end(),vld[i].begin(), vld[i].end());效果一样
}
}
i = 0;
for(auto x:caTemp)
{
ca[i] = x;
i++;
}
}
template<typename T>
class Print
{
public:
Print(){}
void inline operator()(const T& x) const{cout<<x<<" ";}
};//这就是函数对象,这里并没有带数据,只是一个简单的输出操作。
void test()
{
//初始化数组
double a[10] = {0.25, 0.38, 0.7, 0.45, 0.12, 0.78, 0.98,0.37, 0.83, 0.234};
vector<double> ld(a, a+10);
//排序前
for_each(ld.begin(), ld.end(), Print<double>());
cout<<endl;
//调用排序函数
bucketSort(ld);
//排序后
for(auto x:ld)
cout<<x<<" ";
cout<<endl;
}
int main()
{
test();
return 0;
}
总结:
C++是个非常好的开发工具,但是如果不熟悉的话,还是挺耗时间的。编程的时候一定要注意每一个细节,不然就可能被这些细节耽误很多时间。思维一定要保持高度逻辑性,否则就很难debug好。所谓差之毫厘谬以千里,有时候会被一个小;号,和&号搞的代码出错的,所以要非常注意。
分享到:
相关推荐
经典排序算法 - 桶排序Bucket sort 经典排序算法 - 插入排序Insertion sort 经典排序算法 - 基数排序Radix sort 经典排序算法 - 鸽巢排序Pigeonhole sort 经典排序算法 - 归并排序Merge sort 经典排序算法 - ...
sort sort_使用C++实现的排序算法之BucketSort
Simple-Drawing-App-with-Bucket-Tool 是把油漆桶工具整合到简单的绘画程序中。 标签:Simple
排序算法 排序算法_基于C语言实现的排序算法之BucketSort实现
Kademlia DHT K-bucket实现为二叉树。 贡献者 , , , , , , , , , , 安装 npm install k-bucket 测验 npm test 用法 const KBucket = require ( 'k-bucket' ) const kBucket1 = new KBucket ( { ...
开源项目-b3ntly-distributed-token-bucket.zip,分布式令牌桶库
HTML5-Paint-Bucket-Tool 是一款使用 HTML5 和 Javascript 创建的油漆桶工具。 标签:HTML5
桶排序(Bucket Sort) 深度优先搜索(Depth-First Search, DFS) 广度优先搜索(Breadth-First Search, BFS) 二分查找(Binary Search) 线性查找(Linear Search) 素字符串匹配算法(Naive String Matching) ...
桶排序是一种线性排序算法,这里我们来详解Bucket Sort桶排序算法及C++代码实现示例,需要的朋友可以参考下
scoop-bucket-源码.rar
桶排序,顾名思义就是运用桶的思想来将数据放到相应的桶内,再将每一个桶内的数据进行排序,最后把所有桶内数据按照顺序取出来,得到的就是我们需要的有序数据,可以在线性时间O(n)内完成排序工作
BucketSort为AlgorithmMan中的桶排序演示工具(这是可执行文件;需要.net 4.0支持;非源代码)。 原文:C#算法设计排序篇之10-桶排序(附带动画演示程序) 链接:...
Api-bucket_api.zip,bucket listbucket list api的api,一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的数据库通信。通过提取实现并将数据放弃到对象中,api简化了编程。
Bucket4j - is Java rate-limiting library based on token-bucket algorithm. Advantages of Bucket4j Implemented on top of ideas of well known algorithm, which are by de-facto standard for rate ...
python库。 资源全名:cdk-notify-bucket-0.0.51.tar.gz
资源来自pypi官网。 资源全名:cdk-notify-bucket-0.0.68.tar.gz
资源来自pypi官网。 资源全名:cloudcomponents.cdk-deletable-bucket-1.27.0.tar.gz
资源来自pypi官网。 资源全名:cdk-notify-bucket-0.0.98.tar.gz
随机产生一定范围内的随机数,进行桶排序,然后二分查找任意个数的数。
python库。 资源全名:alt-bucket-0.0.2.tar.gz