2012-03-14 5 views
1

私は、実行時エラーを持っているquickselectionquickselectアルゴリズム

#include <cstdlib> 
#include <iostream> 

using namespace std; 
const int n = 15; 
int b[100]; 
int btotal=0; 
int c[100]; 
int ctotal=0; 

void read(int a[],int size){ 
    for (int i=1; i<=15; i++) cin >> a[i]; 
} 

int quickselect(int a[], int k) 
{ 
    int r = 1 + rand()%(n-1); 
    int pivot = a[r]; 
    for (int i=1; i<=n; i++) { 
     if (a[i] < pivot) { 
      b[i] = a[i]; 
      ++btotal; 
     } 

     if (a[i] > pivot) { 
      c[i] = a[i]; 
      ++ctotal; 
     } 
    } 

    if (k <= btotal) quickselect(b,k); 
    if (k > (n-ctotal)) return quickselect(c, k - (n-ctotal));   

    return pivot;   
} 

int main(int argc, char *argv[]) 
{ 
    int a[n]; 
    cout <<" enter contents of array " << endl; 
    read(a, n); 
    quickselect(a, 6); 
    //system("PAUSE"); 
    //return EXIT_SUCCESS; 
    return 0; 
} 

1 4 2 3 5 7 6 9 8 10 13 12 11 15 14 

次のコードを実行したときに、私はここでそれがインデックスに関連する問題ですが、どこ見つけることができないと思う、私を助けてください

+2

が必要? –

+0

no quickselectはありませんが、私はこのコードの主な問題を推測しました –

+0

クイックソートのピボット値を選択すると、3の中央値を選択する方が良いでしょう。これは、アルゴリズムlikleyが良いピボット値を選択するようになります。ランダムな要素を選択し、その要素が最低値または最高値になった場合、アルゴリズムは非常に遅くなります。 –

答えて

2

あなたはあなたの範囲外に書いています。a

int a[15]は、インデックスがa[0]からa[14]まで15個の整数を割り当てます。 [1]をオフセットして[15]に読み書きするのは間違っています。


最小限の変更は、私はあなたが "クイックソート" を意味推測

void 
read (int a[],int size) 
{ 
    for (int i=0; i < 15; i++) // CHANGE TO 
    ... 
} 

... 

int 
quickselect(int a[],int k) 
{ 
    ... 

    for (int i=0; i < n; i++) { // CHANGE TO 

    ... 
} 
+0

はい@refpありがとう、私は1つのインデックス付き配列を使うことができますが、私は1つの事について考える、私は再帰的にquickselectを呼び出すとき、私はすでに存在する配列を上書きしないでください?私はcとbを意味しています –

+0

@dato将来の読者が問題が解決したかどうかを確認するために、* accepted *と回答をマークすることを忘れないでください。 "既に存在していた配列を上書きする"というあなたの質問に関して、それは新しいスレッドでよりよく議論されるトピックです。 –