您的位置:首页 > 其它

算法导论CLRS 8.3 基数排序

2012-10-29 20:42 253 查看
/*8.3 基数排序
*RADIX-SORT
*/
#include<cstdlib>
#include<iostream>
#include<iomanip>
#include<vector>

using namespace std;
typedef vector<size_t>::iterator tvecIte;
typedef vector<pair<size_t, size_t>>::iterator tvecPIte;

void radixSort(const tvecIte &iteB, const tvecIte &iteE, const size_t d)
{//d为最高位
vector<pair<size_t, size_t>> tvecP(iteE - iteB);
tvecIte ite;
tvecPIte iteP;
size_t div = 1,t = 0, r = 10;
while(d != t++) {
iteP = tvecP.begin();
ite = iteB;
while(iteE != ite)
iteP++->first = *ite++;
vector<size_t> tvecC(10, 0);

iteP = tvecP.begin();
while(tvecP.end() != iteP) {
++*(tvecC.begin() + (iteP->second = iteP->first/div%r));
++iteP;
}
ite = tvecC.begin() + 1;//从第二个元素开始叠加
while(tvecC.end() != ite) {
*ite += *(ite - 1);
++ite;
}

iteP = tvecP.end();
while(tvecP.begin() != iteP) {
--iteP;
*(iteB + --*(tvecC.begin() + iteP->second)) = iteP->first;
}

div *= r;
}
}

int main()
{
size_t inData;
vector<size_t> tvec;
cout<<"input some natural numbers with end-of-file!"<<endl;
while(cin>>inData)
tvec.push_back(inData);
//输入的自然数最高位为3
radixSort(tvec.begin(), tvec.end(), 3);
for(tvecIte ite = tvec.begin(); tvec.end() != ite; ++ite)
cout<<setw(10)<<*ite;
cout<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: