2016-05-08 2 views
0

Это никогда не случалось со мной, и я понятия не имел, как это исправить. Он просто говорит «Необработанное исключение в 0x003714e9 в Quick.exe: 0xC00000FD: переполнение стека». затем ломается, и он выделяет скобку и показывает стрелку рядом с ней, которая, я думаю, означает, что ошибка находится там. P.S. Кронштейн жирногоНеобработанное исключение в 0x003714e9 в Quick.exe: 0xC00000FD: переполнение стека

#include<iostream> 
using namespace std; 

int partition(int data[], int left, int right) 
**{** 
    int pivot = data[left]; 
    while(true) 
    { 
     while(data[left] < pivot) 
     { 
      left++; 
     } 
     while (data[right]>pivot) 
     { 
      //find smaller value than pivot from top array 
      right--; 
     } 

     if(left < right) 
     { 
      //change pivot place 
      int temp = data[right]; 
      data[right] = data[left]; 
      data[left] = temp; 
     } 
     else 
     { 
      return right; 
     } 
    } 
} 

void quickSort (int *data, int left, int right) 
{ 

    if(left<right) 
    { 
     int cut = partition(data, left, right); 
     if(cut>1) 
     { 
      quickSort(data, left, right); 
     } 
     if(cut+1<right) 
     { 
     quickSort(data, cut+1, right); 
     } 
    } 
} 

void quickSort(int *data, int length) 
{ 
    quickSort(data, length-length, length-1); 
} 


void print_array(int array[], int size) //this function is to print the array after we finish sorting and we can use it before the sorting begin 
{ 
    int j; 
    for (j=0; j<size; j++) 
    cout <<" "<< array[j]<<endl; 

}//end of print_array 

int main() 
{ 
    const int size = 5; 
    int arr[size]= {1, 17, 4, 6, 20}; 
    quickSort(arr, 0, size); 
    print_array(arr, size); 
    system("pause"); 
    return 0; 
} 
+0

Скорее всего, неконтролируемая рекурсия. Убедитесь, что ваш базовый футляр звучит – stackptr

+0

Ну, я проверил все, но я не вижу ошибки, а не то, что мой код совершенен, но теперь я слепой: P – magician

+0

Предлагаю вам вставить Tracepoint в Visual Studio, сообщение ", а затем введите' {$ CALLSTACK} 'в вашу функцию quicksort. Это замедлит выполнение, но вы получите журнал вызовов в окне «Вывод». – sergiol

ответ

0

Я думаю, что главная проблема заключается здесь:

if(cut>1) 
{ 
    quickSort(data, left, right); 
} 

Вы вызываете функцию снова и снова между влево/вправо. Может быть, вы должны использовать cut вместо right здесь? И на самом деле, сравнить cut с left тогда как вы делаете с right ...

Ошибка «поврежден стек» после фиксации первого выпуска потому, что main() вызывает функцию QuickSort с неверными параметрами - она ​​должна быть либо

quickSort(arr, 0, size-1); 

или

quickSort(arr, size); // the overload handling the -1 

Кроме того, length-length выражения в перегруженной функции является относительно запутанным способом записи 0.

Вы также можете изменить код, чтобы фактически взять размер как right но всегда начинаются в right-1 (это как СТД алгоритмы, которые берут итераторы обычно работают, позволяя пройти end(), который после последнего элемента массива).

+0

Ах спасибо за это. Мы получили ошибку, о которой я говорил, но теперь появилась еще одна ошибка. В ней говорится: «Ошибка проверки времени выполнения №2» - стек с переменной «arr» был поврежден ». со стрелкой, указывающей на закрывающий кронштейн основной функции – magician

+0

Добавлена ​​причина проблемы с поврежденным стеклом ^^ – axalis

+0

Все работает отлично сейчас. Я действительно ценю твою помощь. У меня все еще есть один вопрос, мне нужно лучше понять, что мне делать? – magician