2016-05-31 4 views
0

で実行される比較を追跡します。は、私は単純なC++ソート機能のために作られた比較の量を追跡しようとしているソート

void sort(int arr[], int size) 
{ 

int startScan, minIndex, minValue; 

for (startScan = 0; startScan < (size - 1); startScan++) 
{ 
    minIndex = startScan; 
    minValue = arr[startScan]; 

    for (int index = startScan + 1; index < size; index++) 
    { 
     if (arr[index] < minValue) 
     { 
      minValue = arr[index]; 
      minIndex = index; 
     } 
    } 
    arr[minIndex] = arr[startScan]; 
    arr[startScan] = minValue; 
} 



} 

私は私が作った比較の数を返し、そしておそらく比較の数がstartScanに開催される最初に思ったかもしれないと思っ値で遊んでました。もちろん、スキャンは開始されず、最大サイズを保持することはできません。それは確かに比較の数ではありません。

私はそれが変数のインデックスで見つけられるかもしれないと思いました。だから私はint temp = index;を作成しました。なぜなら私は怠け者でしたし、それをやりたいとは思っていませんでしたが、私がtempの値を返すときにはちょうどサイズ-1でした。なぜ私は別のものを期待していたかわからないが、私は試してみると思った。

は、その後、私はそれについて考え始めた...比較が行われているところ、私も知っていますか?

は私がやるかどうかはわからないが判明します。私はすべての私の比較が2番目のforループで起こることを理解しています。 for (int index = startScan + 1; index < size; index++)さらには実際にはifステートメントが内部にネストされています。

いつでもifの文が実行されると、それが何かを比較しています。スウィート、私は思った。そこで私は関数の先頭にint temp = 0;を作成し、if文の中にtemp++を貼り付けて、これが私に比較の数を与えてくれると思っていました。

今回は私の励みに番号を与えました。私が乱数を選んだように13個の数字のランダムなリストを並べ替えると、私の一時は18の値を返しました。私には私の他の数字と線形の関係はありません。

ここに私の本当の疑問があります。これは機能しますか?私の最終的なコードは、私がしたいことをしているのですか?実際に比較の数を返しますか?あるいは、他の任意の数字が見つかっただけで、他のテストで得られた数字よりも好きになります。私はどのように手動で比較の数をカウントするか分かりません。私は数字が好きですが、私はそれが途方もないかもしれないことをすべて知っています。

決勝コード:

int sort(int arr[], int size) 
{ 
int temp = 0; 
int startScan, minIndex, minValue; 

for (startScan = 0; startScan < (size - 1); startScan++) 
{ 
    minIndex = startScan; 
    minValue = arr[startScan]; 

    for (int index = startScan + 1; index < size; index++) 
    { 
     if (arr[index] < minValue) 
     { 
      minValue = arr[index]; 
      minIndex = index; 
      temp++; 
     } 


    } 
    arr[minIndex] = arr[startScan]; 
    arr[startScan] = minValue; 
} 

return temp; 


} 
+0

:;)ところで

は、念のためにあなたはstd::sortあなたは、このような比較のその数を数えることができるとあなたの並べ替えを比較したいです。 – lcs

+0

私は最初のforループが 'size-1'回実行され、2回目のforループも 'size-1'回実行されますが、何度もmyループが実行されることがわかりますか? すべて追加しますか? – Podo

+0

まあ、今の 'temp'変数は、条件が真のときだけ増やされます。それが偽であっても比較が行われます。 – lcs

答えて

2

配列の値がminValue未満である場合にのみ、あなたのカウンターを増やす:

if (arr[index] < minValue) 
    { 
     minValue = arr[index]; 
     minIndex = index; 
     temp++; 
    } 

あなたはあなたが作るarr[index] < minValue比較回数をカウントしたい場合は、コードを次のように変更する必要があります。

if (arr[index] < minValue) 
    { 
     minValue = arr[index]; 
     minIndex = index; 
    } 
    temp++; 

カウンターにもっと良い名前をつけてください。counterについてはどうですか?各ループは、比較するたびに、それを反復処理してい

#include <algorithm> 
#include <iostream> 

bool myCountingCompare(int a,int b){ 
    static int counter = 0; 
    counter++; 
    std::cout << "number of comparisons : " << counter << std::endl; 
    return a > b; 
} 

int main() { 
    int array[3] = {1,2,3}; 
    std::sort(&array[0],&array[3],myCountingCompare); 
    return 0; 
} 
+0

さて、それは私にはるかに大きく、より合理的な数字を与えている! – Podo

関連する問題