私はquick_select
をC言語で実装していましたが、コードが間違っていて、それを見つけるのに非常に時間がかかりましたが、まだ理解できません。なぜ "middle = arr [(beg + end)/ 2]"がうまくいかないのですか?
機能get_pivot
はquick_select
のピボットを見つけることです、ここで間違ったコードは次のとおりです。
int get_pivot(int*arr, int beg, int end)
{
int middle = arr[(beg + end)/2];
if (middle < arr[beg])
swap(&middle, &arr[beg]);
if (arr[end] < arr[beg])
swap(&arr[beg], &arr[end]);
if (middle>arr[end])
swap(&middle, &arr[end]);
swap(&middle, &arr[end - 1]);
return arr[end - 1];
}
この関数は、3の中間の数を調べると、最後にピボットを移動させるように設計されています。私は理解していない
int get_pivot(int*arr, int beg, int end)
{
int middle = (beg + end)/2;
if (arr[middle] < arr[beg])
swap(&arr[middle], &arr[beg]);
if (arr[end] < arr[beg])
swap(&arr[beg], &arr[end]);
if (arr[middle]>arr[end])
swap(&arr[middle], &arr[end]);
//hide pivot
swap(&arr[middle], &arr[end - 1]);
return arr[end - 1];
}
:私は int middle=(beg+end)/2
でint middle = arr[(beg + end)/2];
を交換し.Hereは、右のコードである代わりにmiddle
のarr[middle]
を使用するまで
しかし、それは(私がquick_select
出力ソートされていない配列を意味する)間違っていましたなぜint middle = arr[(beg + end)/2];
がうまくいかないのですか?
本当にありがとうございます。
あなたの配列に「int」に変換できないものが含まれていると、何が問題になったのかがはっきりします。前者のコードはコンパイルされませんでした*場合は、ラテは戦うチャンスを立てるだろう。 – WhozCraig
「間違っている」、つまり何が結果なのか、何を期待したのかを定義します。また、式にはいくつかのサブ式が含まれています。どのサブ式に期待した価値がないのですか? –