2016-05-08 7 views
0

これは私には起こりませんでした。単に "Quick.exeの0x003714e9で処理されない例外:0xC00000FD:スタックオーバーフロー"と表示されます。ブラケットをハイライト表示し、その横に矢印が表示され、そこにエラーがあることがわかります。 P.P.Quick.exeの0x003714e9でハンドルされない例外:0xC00000FD:スタックオーバーフロー

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

あなたは右/左の間で何度も何度も機能を呼び出している:ブラケットは大胆

#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

Visual StudioでTracepointを挿入し、 "Printあなたのクイックソート機能で '{$ CALLSTACK} 'と入力してください。実行が遅くなりますが、出力ウィンドウで呼び出しのログを取得します。 – sergiol

答えて

0

である私は、主な問題はここにあると思います。たぶんrightの代わりにcutを使用する必要がありますか? main()が間違ったパラメータでクイックソート関数を呼び出すので、実際に、あなたが最初の問題を修正した後right ...

「壊れスタック」エラーで行い、その後のようleftcutを比較することである - それは

のいずれかでなければなりません
quickSort(arr, 0, size-1); 

または

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

また、オーバーロードされた関数内のlength-length式はを書くために、比較的複雑な方法であります。

また、実際にrightとして大きさを取るために、コードを変更したが、その後は常に(これはイテレータを取るSTDアルゴリズムは通常、最後の配列項目の後にあるend()を通過させる、どのように動作するかである)right-1で開始することができます。

+0

ああ、ありがとう。私が指摘していたエラーを解決しましたが、別のエラーがありました。 "変数 'arr'の周りのランタイムチェック失敗#2 - スタックが壊れています。"メイン関数の閉じた括弧を指している矢印 – magician

+0

スタックの問題が壊れている原因を追加しました^^ – axalis

+0

すべてがうまくいきました。私は本当にあなたの助けに感謝します。私はまだ1つの質問がありますが、私は何をすればいいのでしょうか? – magician

関連する問題