Итак, у меня возникла проблема с программой на C++, которая быстро сортирует массив целых чисел. Когда у меня есть более шести элементов в моем массиве, сортировка бесконечно петляет по какой-то причине. Я думаю, что я выделил проблему для выбора ключевого значения в миллиметрах, но я не могу разобраться в жизни меня, почему он заставляет его сломаться.C++ рекурсивный quicksort бесконечный цикл
#include<iostream>
using namespace std;
int getPivot(int begin,int end){//Takes length of array as input and returns the position of the pivot
int len = end-begin;
if(len < 3){
return end;
}else{
return 2;
}
};
void quickSort(int begin, int end, int arr[]){
int pivot = arr[getPivot(begin,end)];//get Pivotal value - If I replace this with just 0 then there are no problems...
int tempLeft = begin, tempRight = end;
int temp;
while(tempLeft <= tempRight){
while(arr[tempLeft] < pivot){//Find a point where there are 2 elements that need to be swapped
tempLeft++;
}
while(arr[tempRight] > pivot){
tempRight--;
}
if(tempLeft <= tempRight){
temp = arr[tempLeft];//Swap the elements
arr[tempLeft] = arr[tempRight];
arr[tempRight] = temp;
tempLeft++;//Skip these swapped elements in the sort
tempRight--;
}
}
if (begin < tempRight){//Only recurse lower if the new sub array has a length greater than 1
quickSort(begin, tempRight, arr);
}
if (tempLeft < end){
quickSort(tempLeft, end, arr);
}
}
main() {
int array[] = {0,1,2,3,4,5,6};
int length = 7;
quickSort(0,length-1,array);
}
Вы спросите, почему у меня такой странный способ выбора моего стержневое значения, но позволяете лишь сказать, что для этого экземпляра поворотного значения должно быть третьим элементом в каждом подсписке или если список саба меньше 3, это последний элемент в подсписке.
Причина, по которой я думаю, что проблема связана с основным значением, заключается в том, что, когда я заменяю свой метод выбора стержня с использованием только первого элемента в подсписке, у меня нет никаких проблем.
Если запустить, как и сейчас, программа будет segfault после цикла бесконечно, но если отсортированный массив будет на один элемент короче, он будет работать нормально. Это заставило меня смутить часами, и я не могу решить, в чем проблема. Если у кого есть какие-либо советы или предложения, они были бы весьма признательны.
Любые особые причины не использовать 'std :: sort'? (например, рекреационные причины?) – 101010
распечатать или отладить и посмотреть, где он пойман – ergonaut
Да, я не использую std :: sort, чтобы я мог понять, как работает алгоритм. Я также много сделал для проверки тестовых случаев, чтобы попытаться найти, где это происходит, но пока все, что я мог сказать, это то, что он попадает в бесконечный цикл. – Killedan9