在 C++ 崩溃中使用向量向量进行基数排序

Posted

技术标签:

【中文标题】在 C++ 崩溃中使用向量向量进行基数排序【英文标题】:Radix sort with a vector of vectors in C++ crashes 【发布时间】:2011-11-23 02:17:37 【问题描述】:

我正在尝试编写一个基数排序,它使用一个随机数向量和一个向量向量作为 bin。

这是代码,错误出现在收集和/或分发函数中的某个地方 - 任何帮助将不胜感激,我只是没有发现它。它没有给我一条错误消息,只是崩溃了。这是我的代码:

#include <iostream>
#include <vector>
#include <ctime>


using namespace std;

void distribute(vector<int> & myList, vector< vector<int> > & bins, int place);
void gather(vector<int> & myList, vector< vector<int> > & bins);
int getNumDigits(vector<int> myList);


int main()
    int place = 1;
    vector<int> myList(20);
    vector< vector<int>  > bins;


    //initialize the vector
    srand((unsigned)time(0));

    for (int i = 0; i < myList.size(); i++)

        myList[i] = rand() % 300;
    

    //get mumber of digits of largest

    place = getNumDigits(myList);

    cout << "Unsorted list: " << endl ;
    for (int i = 0; i < myList.size(); i++)

        cout << myList[i] << " ";
    

    distribute(myList, bins, place);
    gather(myList, bins);

cout << endl << "Sorted once " ;

for (int i = 0; i < myList.size(); i++)

 cout << myList[i] << " ";
 

system("pause");
return 0;

//end main

void distribute(vector<int> & myList, vector< vector<int> > & bins, int place)


bins.clear();

int modder = place * 10;


for (int i = 0; i < myList.size(); i++)

    bins[(myList[i]) % modder].push_back(myList[i]);

    //endfor  (myList[i]) % modder



//end distribute


void gather(vector<int> & myList, vector< vector<int> > & bins)

 for (int i = 0; i < 10; i++)
     for (int j = 0; j < bins[i].size(); j++)

         myList.push_back(bins[i][j]);

     //end inner
 //end outer

 

int getNumDigits(vector<int> myList)

 int place = 0;
 int biggest = 0;
 for (int i = 0; i < myList.size(); i++)

     if (myList[i] > biggest)
         biggest = myList[i];

     

 while (biggest > 0)
     place++;
     biggest = biggest / 10;
     

 return place;


【问题讨论】:

【参考方案1】:

for (int j = 0; j &lt; bins[i].size(); i++) 看起来不对。

我想你的意思是j++,而不是i++

【讨论】:

是的,已修复,但仍然崩溃。我认为这是在这一行: bins[(myList[i]) % modder].push_back(myList[i]);【参考方案2】:

distribute 中的 bins 向量空间不足。把它的开头改成这样:

bins.clear();

int modder = place * 10;

bins.resize(modder);

向量在添加项目时会自动调整大小,但如果不调整大小,则无法访问超出向量大小的项目。

【讨论】:

甜蜜,解决了崩溃问题。非常感谢。

以上是关于在 C++ 崩溃中使用向量向量进行基数排序的主要内容,如果未能解决你的问题,请参考以下文章

C++:使用 LSD 基数排序对字符串进行排序崩溃

从向量中最快擦除元素或更好地使用内存(排序基数)

从不同的基数转换后查找位数的方法

C++ 简单实现基数排序(list容器)

LSD基数排序c++代码

C++ 并行就地基数排序