ピボット位置を返すインプレースパーティション

Since a normal partition returns an index j such that each element with index i <= j is less than the choisen pivot, and each element with index m > j is bigger than the pivot, there are no guarantees that j is the pivot. Would it be possible to create another in place partition algorithm which returns exactly the new pivot position? Initially, I tought of moving the choisen pivot in the last position, but it does not lead to an optimal solution though.

0
あなたの例は間違っています。ピボットが5の場合は、5より小さい数字だけを左に置き、5より大きい数字だけを右にする必要があります(5は中央にしてください)。
追加された 著者 synepis,
'jはピボットであるという保証はありません' Counterexample please?つまり、あなたの質問が正しく分かっていれば、数字とピボットのリストを作って、ピボットの正しい位置が分かれていないのですか?
追加された 著者 Ishtar,
A = {5,3,2,6,4,1,3,7}を定義し、ピボット5とし、このパーティションを出力する{3,3,2,1,4,6,5 、7}、jdは4のインデックスです。
追加された 著者 gr1ph00n,
実際には、私のパーティションは次のようになります。A ≤ x iがi を返し、実行すると上記の出力が得られるはずです。
追加された 著者 gr1ph00n,

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;
}
1
追加された
クール、ありがとう、私の最初のアイデアは大丈夫​​でしたが、私はArray [1..n-1]でのみパーティションを実行する部分がありませんし、それより大きい第1要素でピボットをスワップします。再度、感謝します :)
追加された 著者 gr1ph00n,