您的位置:首页 > 其它

源码系列:计数排序、基数排序、桶排序

2014-12-19 20:06 447 查看
linear_sort.cpp

#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
#include <cmath>

using namespace std;

namespace algo
{
/// 计数排序
void CountingSort(vector<int> &ivec,int maxsize,int n)
{
for(int i=0;i<n;i++)
{
ivec.push_back(rand() % maxsize);
}
cout << "计数排序前序列:" << endl;
copy(ivec.begin(),ivec.end(),ostream_iterator<int>(cout,"\t"));
cout << endl;

vector<int> cvec(maxsize,0);
for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();iter++)
{
cvec[*iter]++;
}

ivec.clear();
for(int i=0;i<maxsize;i++)
{
for(int j=0;j<cvec[i];j++)
{
ivec.push_back(i);
}
}
cout << "计数排序后序列:" << endl;
copy(ivec.begin(),ivec.end(),ostream_iterator<int>(cout,"\t"));
}

/// 基数排序
int GetDigitNum(int number,int d)
{
for(int i=1;i<d;i++)
{
number /= 10;
}
return number % 10;
}

void RadixSort(int dim)
{
vector<int> ivec;
int temp = dim;
for(int i=0;i<10;i++)
{
ivec.push_back(rand() % (int)pow(10.0,dim));
}
cout << "基数排序前序列:" << endl;
copy(ivec.begin(),ivec.end(),ostream_iterator<int>(cout,"\t"));
cout << endl;

for(int i=1;i<=dim;i++)
{
stable_sort(ivec.begin(),ivec.end(),[&](int left,int right) -> bool
{
return GetDigitNum(left,i) < GetDigitNum(right,i);
});
}
cout << "基数排序后序列:" << endl;
copy(ivec.begin(),ivec.end(),ostream_iterator<int>(cout,"\t"));
cout << endl;
}

void BucketSort()
{
vector<double> v;
for(int i=0;i<10;i++)
{
v.push_back((rand() % 100) * 1.0 / 100.0);
}
cout << "桶排序前的序列:" << endl;
copy(v.begin(),v.end(),ostream_iterator<double>(cout,"\t"));
cout << endl;

vector< vector<double> > bucket(10);
for_each(v.begin(),v.end(),[&](double d)
{
bucket[d * 10].push_back(d);
});

for_each(bucket.begin(),bucket.end(),[](vector<double> &sub_v)
{
sort(sub_v.begin(),sub_v.end());
});

v.clear();
for_each(bucket.begin(),bucket.end(),[&](vector<double> &sub_v)
{
v.insert(v.end(),sub_v.begin(),sub_v.end());
});

cout << "桶排序后序列:" << endl;
copy(v.begin(),v.end(),ostream_iterator<double>(cout,"\t"));
}
}


测试程序:

#include <iostream>
#include <vector>
#include "linear_sort.cpp"

using namespace std;

int main()
{
vector<int> ivec;
algo::CountingSort(ivec,100,100);
cout << endl;

algo::RadixSort(5);
cout << endl;

algo::BucketSort();
cout << endl;
return 0;
}


测试结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐