我只需要用于c ++语言的基数排序实现,它适用于字符串
我已经拥有适用于正常整数的那个
vector < vector < int> > blocks[7];
void radixSort(int rsarr[],int length){
int index;
vector<int> helper;
vector< vector<int> > helper2;
for(int e=0;e<10;e++){
helper2.push_back(helper);
}
for(int r=0;r<7;r++){
blocks[r]=helper2;
}
for(int y=0;y<length;y++){
index=(int)(rsarr[y])%10;
blocks[0][index].push_back((rsarr[y]));
}
for(int j=1;j<7;j++)
{
for(int k=0;k<10;k++)
{
for(int i=0;i<blocks[j-1][k].size();i++)
{
index=(int)(blocks[j-1][k][i]/pow(10,j))%10;
blocks[j][index].push_back(blocks[j-1][k][i]);
}
}
}
int q=0;
for(int f=0;f<blocks[6][0].size();f++){
rsarr[q]= blocks[6][0][f];
q++;
}
if(blocks[6][1].size()==1)
{
rsarr[q]=blocks[6][1][0];
}
for(int z=0;z<7;z++)
{
blocks[0].clear();
}
}
答案 0 :(得分:1)
基数排序的功能。
// this is the sort function which call the radixSort Function.
void Datastructure::sort()
{
vector<string> tempOneDimWordList;
tempOneDimWordList = WordList;
WordList.clear();
radixSort(tempOneDimWordList, (unsigned int)tempOneDimWordList.size(), 0);
}
// MSD radix function definition to sort words
//lexicgraphically using most significat bits.
void Datastructure::radixSort(vector<string> tempOneDimWordList,
unsigned int oneDimVecSize, unsigned int offset)
{
if(offset == lengthOfMaxWord.length ){
return;
}
vector<string> towDimWordlist [MAX_LENGTH];
for (unsigned int i = 0; i < oneDimVecSize; i++){
if(offset < tempOneDimWordList[i].size()){
char c = tempOneDimWordList[i][offset];
if (c != '\0'){
towDimWordlist[(((unsigned int)c) )].
push_back(tempOneDimWordList[i]);
}
}
else{
WordList.push_back(tempOneDimWordList[i]);
}
}
// this loop is used to call the function recursively
// to sort the words according to offset.
for (unsigned int i = 0; i < (unsigned int)MAX_LENGTH; i++) {
unsigned int sizeCheck = (unsigned int)towDimWordlist[i].size();
if (sizeCheck > 1){
radixSort(towDimWordlist[i], sizeCheck, offset+1);
}
else if(sizeCheck == 1)
{
WordList.push_back(towDimWordlist[i][0]);
}
}
看看here in this blog that I have written。这里有完整源代码和测试输入文件的下载链接。它可以很好地排序任意长度的字符串。解决这个问题时我有很多痛苦。所以想分享它是否有助于其他人。快乐分享。 :)
答案 1 :(得分:0)
尝试对字符串使用基数排序的问题是字符串可以任意长。基数排序实际上只对固定大小的键有意义。
如果作为初始传递,您找到最长字符串的长度(或者,作为细化,第二长字符串),则仍然可以执行此操作,然后从该位置开始进行基数迭代。
请注意,不是每个基数迭代保存一个数组,而是只使用源和目标数组 - 在迭代之间交换它们。
答案 2 :(得分:0)
这是一个可怕的,未经测试的c和c ++混合,它显示了一种处理字符串的方法。
在清晰度和性能方面,有很多方法可以改进它。
要解决的第一件事就是避免在堆栈上创建大量向量。 @ comingstorm关于使用两个数组的想法是一个很好的起点。
const int numblocks = 256;
void radixSort(String rsarr[],int length, int offset = 0)
{
int inplace = 0;
vector<String> blocks[numblocks];
//split the strings into bins
for (int i=0;i<length;i++)
{
char c = rsarr[i][offset];
if (c!='\0')
blocks[(int)c].push_back(rsarr[i]);
else //put the null strings up front
rsarr[inplace++]=rsarr[i];
}
//for blocks all except the null terminated one,
// copy back into original array in order,
// then radix sort that portion of the array
for (int b=1;b<256;b++)
{
for (int j=0;j<blocks[b].length();j++)
rsarr[inplace++]=blocks[b][j];
if (j>1)
radixSort(rsarr[inplace-j],j,offset+1);
}
}