сортировка — вставка и сортировка слиянием не работают на больших наборах данных Переполнение стека

Я пытался написать вставку и сортировку слиянием для набора данных, который я прочитал из файла. При тестировании своего кода я использовал небольшой набор данных (включает 6 цифр), и моя программа работала отлично. но когда я использовал больший набор данных с 1000000 входами, код не работает, и я не могу понять, почему. Я пытался изменить тип векторов, чтобы удвоить, но это не решает проблему.
Заранее спасибо за вашу помощь.

Мой набор данных состоит из чисел, таких как: 512069, 12823, 11628

вот мой код:

  vector<int> readFile(string fileName);
void display(vector<int> &vector);
void insertionSort(vector<int> &vec);
vector<int> merge(vector<int> left, vector<int> right);
vector<int> mergeSort(vector<int> &m);

int main(int argc, const char * argv[]) {

string fileName;
cout<<"Enter input file name :";
cin>>fileName;

vector<int> numbersVec = readFile(fileName);
display(numbersVec);

cout<<"INSERTION SORT"<<"\n";
insertionSort(numbersVec);
display(numbersVec);

cout<<"MERGE SORT"<<"\n";
vector<int> neu = mergeSort(numbersVec);
display(neu);return 0;
}vector<int> readFile(string fileName){

vector<int> numbers;
ifstream in(fileName,std::ios::in);

if(!in.is_open())
{
cout << "File Cannot be Opened" << endl;
}

else{

int number;
while (in >> number) {
numbers.push_back(number);
}
}

in.close();
return numbers;
}void display(vector<int> &vec) {

for(int i = 0; i < vec.size(); i++)
{
cout << vec[i] << " ";
}
cout << "\n" << endl;

}void insertionSort(vector<int> &vec) {

long double i, j, tmp;

for (i = 1; i < vec.size(); i++) {

j = i;

while (j > 0 && vec[j - 1] > vec[j]) {

tmp = vec[j];
vec[j] = vec[j - 1];
vec[j - 1] = tmp;
j--;

}
}
}vector<int> merge(vector<int> tmpl, vector<int> tmpr){

vector<int> res;

while ((int)tmpl.size() > 0 || (int)tmpr.size() > 0) {

if ((int)tmpl.size() > 0 && (int)tmpr.size() > 0) {

if ((int)tmpl.front() <= (int)tmpr.front()) {

res.push_back((int)tmpl.front());
tmpl.erase(tmpl.begin());

}

else {

res.push_back((int)tmpr.front());
tmpr.erase(tmpr.begin());

}

}
else if ((int)tmpl.size() > 0) {

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

res.push_back(tmpl[i]);

break;
}

else if ((int)tmpr.size() > 0) {

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

res.push_back(tmpr[i]);

break;

}

}

return res;

}vector<int> mergeSort(vector<int> &vec)
{
if (vec.size() <= 1)

return vec;

vector<int> tmpl, tmpr, res;

int mid = ((int)vec.size()+ 1) / 2;

for (int i = 0; i < mid; i++) {

tmpl.push_back(vec[i]);

}

for (int i = mid; i < (int)vec.size(); i++) {

tmpr.push_back(vec[i]);

}

tmpl = mergeSort(tmpl);

tmpr = mergeSort(tmpr);

res = merge(tmpl, tmpr);

return res;
}

1

Решение

Ваши алгоритмы кажутся в порядке. Это только вопрос сложности. Если вы посчитаете, сколько раз while алгоритма сортировки вставок выполняется, в среднем он близок к n(n-1)/2 где n размер вашего набора данных (см. сортировка вставок).

Если n = 1.000.000, сложность близка к 500.000.000.000, что очень долго.

Просто попробуйте прокомментировать звонок insertionSort в main и ваш main Функция должна закончиться рано.

Обратите внимание, что даже если вы делаете (слишком) несколько vector копии в вашем mergeSort алгоритм, он закончится рано. Сложность ‘n * log (n)’ (см. Сортировка слиянием).

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector