2016-03-30 2 views
1

私はquick_selectをC言語で実装していましたが、コードが間違っていて、それを見つけるのに非常に時間がかかりましたが、まだ理解できません。なぜ "middle = arr [(beg + end)/ 2]"がうまくいかないのですか?

機能get_pivotquick_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)/2int middle = arr[(beg + end)/2];を交換し.Hereは、右のコードである代わりにmiddlearr[middle]を使用するまで

しかし、それは(私がquick_select出力ソートされていない配列を意味する)間違っていましたなぜint middle = arr[(beg + end)/2];がうまくいかないのですか?

本当にありがとうございます。

+0

あなたの配列に「int」に変換できないものが含まれていると、何が問題になったのかがはっきりします。前者のコードはコンパイルされませんでした*場合は、ラテは戦うチャンスを立てるだろう。 – WhozCraig

+0

「間違っている」、つまり何が結果なのか、何を期待したのかを定義します。また、式にはいくつかのサブ式が含まれています。どのサブ式に期待した価値がないのですか? –

答えて

2

それは

swap(&middle, &arr[beg]); 

middleは別の変数であり、あなたが上記の方法を使用して交換する場合、配列(array[middle])の実際の要素があり、このためラインの問題が発生した(と同様のもの以降)スワップされていない(必要なもの)。


あなたは、配列のインデックスbegmiddle内の要素を交換したいです。

+0

次のように書くこともできます:swap(arr + middle、arr + beg); –

+0

@MarioDekena、True。 – Haris

+0

ありがとう!私はこれに注意するよ! –

関連する問題