Radix sort с вектором векторов в C ++ вылетает - PullRequest
0 голосов
/ 23 ноября 2011

Я пытаюсь написать радикальную сортировку, которая использует вектор случайных чисел и вектор векторов для бинов.

Вот код, ошибка где-то в функциях сбора и / или распространения - любая помощь будет оценена, я просто ее не замечаю.Это не дает мне сообщение об ошибке, просто сбой.Вот мой код:

#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;

}

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

Недостаточно места в вашем bins в distribute. Измените его начало на это:

bins.clear();

int modder = place * 10;

bins.resize(modder);

Вектор будет автоматически изменять размер при добавлении к нему элементов, но вы не сможете получить доступ к элементу, превышающему векторный размер, без изменения его размера ранее.

1 голос
/ 23 ноября 2011

for (int j = 0; j < bins[i].size(); i++) выглядит не так.

Полагаю, вы имели в виду j++, а не i++.

...