Hoare のパーティション アルゴリズムの実装に非常に苦労しています。基本的に、私がやりたいことは、配列を 2 つの部分に分割することです。最初の部分には、指定された より小さい数値が含まれx
、もう 1 つはより大きい数値が含まれます。ただし、適切な実装を理解することはできません。これは私のコードです:
void hoare(vector<int>&arr,int end, int pivot)
{
int i = 0;
int j = end;
while (i < j)
{
while (arr[i] < pivot)
i += 1;
while (arr[j] > pivot)
j -= 1;
swap(arr[i],arr[j]);
}
// return arr;
for (int i=0; i<end; i++)
printf("%d ", arr[i]);
}
今、私が(arr[i] <= pivot)
そこに置いたものではなく、たくさんのサイトにwhileがあることがわかりました. ただし、これを行うと、次のような配列の場合:
1 3 5 7 9 2 4 6 8
私は得る:
1 3 5 4 9 2 7 6 8
しかし、私のバージョンでは、そのようなセットについては次のようになります。
12 78 4 55 4 3 12 1 0
外側のループのどちらの条件も満たされないため、プログラムはフリーズしj
ますi
。
ピボットは、1 から数えて、配列内の特定の数値へのポインターです。たとえば、最初の例で関数に渡された数値 3 はpivot
equals arr[2]
、つまり 5 を意味します
それが初心者の質問であるか、すでに回答されている場合は申し訳ありませんが、私はこれに一日中費やしましたが(解決策をネットで検索しても)役に立たず、今は自殺願望があります.
前もって感謝します。