通常のパーティションは、インデックス i <= j を持つ各要素が選択されたピボットよりも小さく、インデックス m > j を持つ各要素がピボットよりも大きくなるようなインデックス j を返すため、j がピボットであるという保証はありません。新しいピボット位置を正確に返す別のインプレース パーティション アルゴリズムを作成することは可能でしょうか? 最初はチョイスンピボットを最後に動かそうと思ったのですが、最適解には至りません。
2038 次
1 に答える
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;
}
于 2012-02-06T19:41:19.073 に答える