0

通常のパーティションでは、インデックスがi= jの各要素がchoisenピボットより小さく、インデックスm> jの各要素がピボットより大きいjがピボットであるという保証はない。正確に新しいピボット位置を返す場所パーティションアルゴリズムを別の場所に作成することは可能でしょうか? 最初は、最後のポジションでchoisenピボットを動かす必要がありましたが、最適な解決には至りません。ピボット位置を返す場所のパーティション

+0

'jがピボットであるという保証はありません。つまり、あなたの質問が正しく分かっていれば、数字とピボットのリストを作って、ピボットの正しい位置が分かれていないのですか? – Ishtar

+0

A = {5,3,2,6,4,1,3,7}を定義し、ピボット5としましょう。これを出力するパーティションを実行してください。{3,3,2,1,4,6、 5,7}とjdは4のインデックスです。 – gr1ph00n

+1

あなたの例は間違っています。ピボットが5の場合は、5より小さい数字だけを左に置き、5より大きい数字だけを右にする必要があります(5は中央にしてください)。 – synepis

答えて

1

重要なことは、スワッピングのピボットを外しておくことです。ただし、境界線の1つに戻し、最後に正しい場所にスワップするときは、最初の点を除きます。

int partition(int *A, int low, int high) { 

    if (high <= low) return low; // in that case, partition shouldn't be called, but cater for it 

    int pivot_position = low; // or high, or low + (high-low)/2, or whatever 
    int pivot = A[pivot_position]; 

    A[pivot_position] = A[high]; 
    A[high] = pivot; // these two lines are unnecessary if pivot_position == high 
    int i = low, j = high-1; 

    while(i < j) { 

     while(i < j && A[i] <= pivot) 
      ++i; // i == j or A[i] > pivot, and A[k] <=pivot for low <= k < i 

     while(i < j && A[j] > pivot) 
      --j; // i == j or A[j] <= pivot, and A[m] > pivot for j < m < high 

     if (i < j) { 
      int temp = A[j]; 
      A[j] = A[i]; 
      A[i] = temp; 
     } 
    } 
    if (A[i] <= pivot) 
     ++i; 

    // now A[k] <= pivot for low <= k < i and A[m] > pivot for i <= m < high 
    A[high] = A[i]; 
    A[i] = pivot; 
    return i; 
} 
+0

Cool、ありがとう、私の最初のアイデアは大丈夫​​でしたが、私はArray [1..n-1]でのみパーティションを実行する部分を欠いていて、それより大きな第1要素でピボットを入れ替えました。再度、感謝します :) – gr1ph00n

関連する問題