ページ 11

ソートの移動回数

Posted: 2011年6月03日(金) 23:13
by mai
Linux
gcc


ランダムになっている整数をソートするプログラムを作っていて、その際、ソートするために移動した回数を数えたいのですが、どこで回数をカウントすれば良いかが分かりません。
関数は、バブルソートとクイックソートです。
よろしくお願いします。

コード:

void buble_sort(int size, int *array){
        int i, x, j;

        for(i = 0; i < size; i++){
          for(j = size - 1; j > i; --j){
            if(array[j - 1] >= array[j]){
               x = array[j - 1];
               array[j - 1] = array[j];
               array[j] = x;
           }
         }
       }
      return ;


void quick_sort(int low, int high, int *array){
       int i, j, mid, tmp;
       i = low;
       j = high;
       mid = array[(low + high) / 2];
       do{
           while(array[i] < mid)
              i++;
           while(x < array[j])
              j--;
           if(i <= j){
              tmp = array[i];
              array[i] = array[j];
              array[j] = tmp;
              i++;
              j--;
          }
      } while(i <= j);
      if(low < j)
         quick_sort(low, j, array);
      if(i < high)
         quick_sort(i, high, array);
      return ;
}

Re: ソートの移動回数

Posted: 2011年6月03日(金) 23:32
by GRAM
さて、まずは質問ですが
要素の移動とは何を指すのでしょうか?
このプログラムの場合行われているのは単純な移動ではなく要素の交換です
交換の回数を計ればよろしいのですか?それともほんとに要素が移動するたび数えるのですか?

さて、どちらにしても交換が起きている箇所(つまり少なくとも要素が移動している箇所)
では以下の動作をしています

①一時的に要素を保存
②保存の終わった要素にもう一方の要素を代入
③今代入を行った要素に保存しておいた要素を代入(これで交換が終わる)

こういう箇所を探してカウントしてみてください

Re: ソートの移動回数

Posted: 2011年6月03日(金) 23:44
by bitter_fox
先日類似の問題に返答しましたので参考にしてください。
http://dixq.net/forum/viewtopic.php?f=3&t=8599