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;
}
测试结果: