2015-06-23 3 views
-2

Итак, вся моя программа показана ниже. По какой-то причине, когда вызывается функция раздела, она бросает ошибку переполнения стека. Я вылил код и искал помощь. Вы прекрасные программисты - моя последняя надежда. Все остальное прекрасно работает или, по крайней мере, так же хорошо, как и нужно. Я был бы признателен, если бы вы могли посмотреть на Quicksort и функции раздела для меня и посмотреть, сможете ли вы выяснить, где я испортился.Ошибка быстрого переполнения стека

#include <iostream> 
    #include <string> 
    #include <fstream> 
    #include <vector> 
    #include <time.h> 
    #include <stdio.h> 
    #include <dos.h> 

using namespace std; 

vector<int> DataIn(ifstream&); 

void quickSort(int, int, vector<int>&, int); 

int partition(vector<int>& list, int start, int end) 
{ 
    int pivot = list[start]; 
    int index = start; 

    for (int i = start + 1; i < end; i++) 
    { 
     if (list[i] <= pivot) 
     { 
      swap(list[index], list[i]); 
     } 
    } 

    index++; 

    if (index != end) 
    { 
     swap(list[index], list[start]); 
    } 
    return index; 
} 

void swap(int& a, int& b) 
{ 
    int temp = a; 
    a = b; 
    b = temp; 
} 

int main() 
{ 
    int repeat = 0; 
    int fileCount = 1; 

    while (repeat == 0) 
    { 

     int loadFail = NULL; 

     cout << "\nWhat is the file name: "; 

     string fileName; 
     cin >> fileName; 

     ifstream fileIn(fileName); 

     do 
     { 
      if (fileIn.fail()) 
      { 
       loadFail = 1; 
       cout << "\nUnable to open file. Please try again:"; 

       cout << "\nWhat is the file name: "; 

       cin >> fileName; 
       ifstream fileIn(fileName); 

       if (fileIn.good()) 
       { 
        loadFail = 0; 
       } 
      } 
      else 
      { 
       loadFail = 0; 
      } 
     } while (loadFail == 1); 

     vector<int> fileData; 

     fileData = DataIn(fileIn); 

     int fileLength = fileData.size(); 

     void quickTime = quickSort(0, fileLength - 1, fileData, fileCount); 


    return 0; 
}; 

vector<int> DataIn(ifstream& read) 
{ 
    vector<int> data; 
    int dataLine; 

    while (!read.eof()) 
    { 
     read >> dataLine; 
     read.ignore(); 
     data.push_back(dataLine); 
    } 

    return data; 
} 

void quickSort(int begin, int end, vector<int>& list, int fileNum) 
{  
    int mid = 0; 

    if (end > begin) 
    {  
     mid = partition(list, begin, end); 
     quickSort(begin, mid, list, fileNum); 
     quickSort(mid + 1, end, list, fileNum); 
    } 

    return elapsed_time;  
} 
+0

У вас есть отладчик, используйте его пожалуйста! Как вы думаете, что вызов 'quickSort (begin, mid, list, fileNum),' рекурсивно изменит условия для вызова в следующей рекурсии? Он будет просто потреблять весь стек и бросать, как вы переживаете. –

+2

Пожалуйста, укажите [** минимальный **, полный и ** проверяемый пример **] (http://www.stackoverflow.com/help/mcve). Также ваш алгоритм разбиения не выглядит правильным. Подумайте о том, что делает этот первый цикл в сравнении с тем, что он должен делать. – Barry

+0

Хорошо, я достал кучу кода, который не нужен, чтобы быть в состоянии помочь мне. У меня все еще есть проблемы с выяснением того, что я сделал не так. Может кто-то может помочь немного больше? – Trovan

ответ

0

У вас есть несколько серьезных проблем в вашем размещенном коде.

  1. Вы пытаетесь вернуть значение в функцию void (quickSort). Также я не вижу, где вы указали эту переменную.

  2. Вы объявляете переменную типа void, что неверно. Функция void возвращает void, это означает, что она ничего не возвращает.

  3. У вас есть недостающая скобка в конце функции main().

  4. Ваш цикл в то время как никогда не остановится, потому что повторение всегда равна с 0.

  5. В вашей быстрой функции сортировки, в первом рекурсивного вызова должен быть в середине 1

  6. Ваша функция секционирования логическая ошибка

Также переменная filenum не используется нигде.

Это измененная версия вашего кода, которая действительно работает.

#include <iostream> 
#include <string> 
#include <fstream> 
#include <vector> 
#include <time.h> 
#include <stdio.h> 
#include <dos.h> 

using namespace std; 

vector<int> DataIn(ifstream&); 

void quickSort(int, int, vector<int>&); 

int partition(vector<int>& arr, int left, int right) 
{ 
    int pivot = arr[left]; 
    while (left != right) 
    { 
     if (arr[left] > arr[right]) 
     { 
      swap(arr[left], arr[right]); 
     } 
     if (pivot == arr[left]) 
      right--; 
     else 
      left++; 
    } 
    return left; 
} 

void swap(int& a, int& b) 
{ 
    int temp = a; 
    a = b; 
    b = temp; 
} 

int main() 
{ 
    int repeat = 0; 
    int fileCount = 1; 

     int loadFail = NULL; 

     cout << "\nWhat is the file name: "; 

     string fileName; 
     cin >> fileName; 

     ifstream fileIn(fileName); 

     do 
     { 
      if (fileIn.fail()) 
      { 
       loadFail = 1; 
       cout << "\nUnable to open file. Please try again:"; 

       cout << "\nWhat is the file name: "; 

       cin >> fileName; 
       ifstream fileIn(fileName); 

       if (fileIn.good()) 
       { 
        loadFail = 0; 
       } 
      } 
      else 
      { 
       loadFail = 0; 
      } 
     } while (loadFail == 1); 

     vector<int> fileData; 

     fileData = DataIn(fileIn); 

     int fileLength = fileData.size(); 

     quickSort(0, fileLength - 1, fileData); 


     return 0; 
} 

    vector<int> DataIn(ifstream& read) 
    { 
     vector<int> data; 
     int dataLine; 

     while (!read.eof()) 
     { 
      read >> dataLine; 
      read.ignore(); 
      data.push_back(dataLine); 
     } 

     return data; 
    } 

    void quickSort(int begin, int end, vector<int>& list) 
    { 
     int mid = 0; 

     if (end > begin) 
     { 
      mid = partition(list, begin, end); 
      quickSort(begin, mid-1, list); 
      quickSort(mid + 1, end, list); 
     } 
    } 
+0

Спасибо, я знал, что кто-то сможет увидеть, что я пропустил. Недостаток понимания того, как работает quicksort, - это мое падение. – Trovan

+0

@Trovan, можете ли вы пометить мой ответ в качестве решения, если он исправит вашу проблему? –

Смежные вопросы