/*8.4 桶排序
*BUCKET-SORT
*/
#include<cstdlib>
#include<iostream>
#include<iomanip>
#include<vector>
using namespace std;
struct Node
{
double value;
Node *next;
};
typedef vector<Node>::iterator bvecIte;
typedef vector<double>::iterator dvecIte;
void bucketSort(const dvecIte &iteB, const dvecIte &iteE, int d)
{//d为小数点前的最高位
size_t div = 1;
while(0 < --d)
div *= 10;
vector<Node> bvec(10); //十个桶0~9
bvecIte bIte = bvec.begin();
while(bvec.end() != bIte) {
(*bIte).value = 0;
(*bIte++).next = NULL;
}
Node *p, *q;
dvecIte ite = iteB;
while(iteE != ite) {
Node *insert = new Node();
insert->value = *ite;
insert->next = NULL;
bIte = bvec.begin() + (size_t)*ite / div;
p = &(*bIte);
q = (*bIte).next;
if(NULL == q)
p->next = insert;
else {
while(NULL!=q && q->value<=*ite) {
p = q;
q = q->next;
}
p->next = insert;
insert->next = q;
}
++ite;
}
//用桶填充原来的容器
size_t counter = 0;
bIte = bvec.begin();
while(bvec.end() != bIte) {
q = (*bIte).next;
while(NULL != q) {
*(iteB + counter++) = q->value;
q = q->next;
}
++bIte;
}
}
int main()
{
double inData;
vector<double>dvec;
cout<<"input some nonnegative numbers with end-of-file!"<<endl;
while(cin>>inData)
dvec.push_back(inData);
//输入的自然数最高位为3
bucketSort(dvec.begin(), dvec.end(), 3);
for(dvecIte ite = dvec.begin(); dvec.end() != ite; ++ite)
cout<<setw(10)<<*ite;
cout<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
算法导论CLRS 8.4 桶排序
最新推荐文章于 2020-04-23 21:53:36 发布