2010-12-11 8 views
1

こんにちは、私はhwのためにこの関数を書いています。それはベクトルの代わりに配列でうまく動作しても動作しません。誰でも助けてくれますか?前もって感謝します :]。奇妙なバグのベクトルを使ったクイックソート

void quick2 (vector <int> & qlist2, int left, int right) { 
    int i = left, j = right; 
    int middle = qlist2[qlist2.size()/2]; 
    if (j - i < 1) { 
     return; 
    } 
    while (i <= j) { 
     while (qlist2[i] < middle) { 
      i++; 
     } 
     while (qlist2[j] > middle) { 
      j--; 
     } 
     if (i <= j) { 
      swap (qlist2[i], qlist2[j]); 
      i++; 
      j--; 
     } 
    } 

    if (left < j) 
     quick2 (qlist2, left, j); 
    if (i < right) 
     quick2 (qlist2, i, right); 
} 
+1

「動作していません」どうしてうまくいかないのですか? –

+0

jが2番目の 'while'ループで-1に達する – CNoobie

答えて

3

として、あなたの関数を宣言してみてください。

void quick2(vector<int> & qlist2, int left, int right) 

そしてreturn声明を省略。

問題は、配列がCおよびC++でポインタによって渡されることです。各再帰呼び出しは、メモリの同じブロックへのポインタのコピーを受け取り、同じ配列を変更し、再帰呼び出しによって行われた配列の変更を呼び出し側が認識できるようにします。

ベクトルはオブジェクトなので、各再帰呼び出しにはベクトルの完全なコピーが渡されます。再帰呼び出しによって行われた変更は、呼び出し元には表示されません。上記の変更は代わりに参照をベクターに渡し、新しい関数呼び出しごとにコピーされないようにします。代わりに、すべての呼び出しが同じオブジェクトで動作します。

また、middleの初期化を確認してください。書かれているように、配列の中間要素を取っています。各要素は、呼び出しごとに同じです。 (qlist2.size()は呼び出しから呼び出しに変更されません)。

+0

こんにちはニック、助けてくれてありがとう:]私は本当にばかげたことをして、値の代わりに中間のインデックスを得たことに気付きました。私はそれを修正し、あなたが示唆したように関数をvoidに変更しましたが、何らかの理由でそのループが繰り返されました。 – CNoobie