2016-09-06 3 views
0

クイックソートアルゴリズムに問題があります。コードはエラーなしでコンパイルされますが、プログラムを実行しようとすると「乱数は次のようになります」という出力が得られ、ユーザーからの入力が必要なように動作し、プログラムを終了する必要があります。今私のメインプログラムでクイックソート機能の呼び出しを取り除くと、プログラムは数字を出力しますが、クイックソート機能の呼び出しでは機能しません。私が使用しているパラメータが問題であるかどうか、それが関数そのものかどうかはわかりません。クイックソートアルゴリズムの問​​題

#include <iostream> 
#include <stdlib.h> 
#include <iomanip> 
#include <stack> 
#include <queue> 
using namespace std; 

void quicksort(int arr[], int left, int right) { 
    int l = left; 
    int r = right; 
    int tmp; 
    int pivot = arr[(left + right)/2]; 

    while (l <= r) { 
    while (arr[l] < pivot) 
     l++; 
    while (arr[l] > pivot) 
     r--; 
    if (l <= r) { 
     tmp = arr[l]; 
     arr[l] = arr[r]; 
     arr[r] = tmp; 
     l++; 
     r--; 
    } 
    } 

    if (left < r) 
    quicksort(arr, left, r); 
    if (l < right) 
    quicksort(arr, r, right); 

} 

int main() { 
    int n = 20; 
    int testlist[n]; 

for (int i = 0; i<n; i++) { 
    testlist[i] = rand()%100; 
} 

cout << "The random numbers are: " << endl; 
for (int i = 0; i < n; i++) cout << testlist[i] << " "; 


quicksort(testlist, 0, n - 1); 

cout << " " << endl; 

cout << "The sorted numbers are: " << endl; 
for (int i = 0; i < n; i++) { 
    cout << testlist[i] << " "; 
} 

return 0; 

} 
+0

提案:普通の 'l'(小文字のL)は' 1'のように見えますが、これはコードを読むときに混乱します。 –

答えて

1

何かがquicksort()内でうまくいかないと、あなたはstd::endlなし数字を印刷するためです!

std::endlがないと、番号は出力バッファに書き込まれますが、フラッシュされません。彼らは、最終的にstd::endlがなくても、あなたのコードはその時までには成立しません。

プロフェッショナル:コードをデバッグするときは、常にstd::endlを使用してください!


あなたは練習するために、それを行う必要があるため、私は、あなたのquicksort()をデバッグしません!参照が必要な場合は、の両方の人々が簡単にフォローできるように、のような方法で書かれた私の赤ちゃんの例:Quicksort (C++)をいつでも使用できます。 :)


のHunch:あなたは再帰を使用し、あなたのプログラムが終了しません... 無限ループが原因である可能性があります...;)ところで


、私があなただったらそして、使用するすべての重要な理由を持っていなかった。

#if __INCLUDE_LEVEL__ < 1 

私は(同行#endifと一緒に)それを捨てるでしょう。

+0

私は彼のバグを見ています。それは単なる通常の無限ループです。 –

+0

私はとても頑張りました**彼は練習できるように彼のバグを教えていません**。幸いにも、もう1つの答えでは問題は解決されません。あなたのコードであるPsyduckをデバッグすることを願っています。 :) – gsamaras

4

quicksort関数に無限ループがあります。この関数は返さないので、quicksort呼び出しが返されないので、 "The random numbers are:"行の後には何も出力されません。システムが出力バッファを画面に直ちにフラッシュすることが保証されていないので、乱数そのものが印刷される場合と印刷されない場合があります。 (あなたが数字を印刷し、forループの後coutstd::endlを書いたなら、彼らはおそらく印刷される。)

私はこれが問題である疑いがある:

while (arr[l] > pivot) 
    r--; 

声明while (arr[l] > pivot)は、おそらく実際にwhile (arr[r] > pivot)する必要があること。

+0

デビッド申し訳ありませんが、これは私の間違った編集だった、あなたの編集を削除!また、これで問題は解決されず、コードがクラッシュする恐れがあります。 – gsamaras

+0

OPの現在の/元のコードと一致するように編集を削除しました。クラッシュについては、無限ループがその機能の唯一のバグではありませんでした。 OPがデバッガを使用して何が起こっているかを見るためのステップを踏むのは楽しい時です...あるいは、変数が混ざり合っているような同様のコピー・ペースト・ミスを探してください。 ;-) –

+0

Davidありがとう! :)私は混乱のために謝罪しましょう。 :/ – gsamaras

関連する問題