クイックソートについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
野球君

クイックソートについて

#1

投稿記事 by 野球君 » 8年前

•異なる乱数で初期化された配列を10個用意して、バブルソートとクイックソートでソートし、要素の入れ替えがおこなわれる回数を比較
•配列のサイズを100, 1000, 10000, 100000と増やしていって、入れ替えの回数を比べる
という内容の課題に取り組んでいるのですが、
クイックソートによる入れ替えの回数を表示する方法が分かりません><
このプログラムをどのように改良すれば入れ替えの回数を表示できるか教えていただきたいです><

コード:

#include <stdio.h>
#include <stdlib.h>

#include<time.h>
# define X 10
# define Y 100/*課題通りサイズを100,1000,10000,100000で結果を試す*/
void quick_sort(int *data, int head, int tail);
int countQ=0;

int main()
{
  int b[X][Y];/*クイック用配列*/
  int a[X][Y];/*バブル用配列*/
  int m,n,i,j,k,l;
  unsigned int count;
  srand( (unsigned int)time( NULL ) ); 
  int number=sizeof(b)/sizeof(b[0]);
  int number2=sizeof(b[0])/sizeof(b[0][0]);

  printf("左の回数がバブルソート,右の回数がクイックソートによる\n"); 

  for(n=0;n<number;n++)
    {
      printf("%d回目:",n+1); 
      count=0;
      countQ=0;
      for(m=0;m<number2;m++)
	{
	  b[n][m]=rand();
	  a[n][m]=b[n][m];
	}      

      /*バブルソート*/
      for (j = number2-1; j > 0; j --)
	{
	  for (i = 0; i < j; i ++)
	    {
	      if(b[n][i]>b[n][i+1])
		{
		  k=b[n][i];
		  b[n][i]=b[n][i+1];
		  b[n][i+1]=k;
		  count++;
		}
	    }
	}

      quick_sort(a[n], 0, number2-1);/*クイックソート*/
      printf("%ld回  ",count);
      printf("%d回\n",countQ);
    } 
  return 0;
}



void quick_sort(int *data, int head, int tail)
{
  int x, y;
  int  s, t;
  
  s = data[head];
  x = head;
  y = tail;
  do
    {
      while (data[x] < s)
	x++;
      while (data[y] > s)
	y--;
      if (x <= y)
	{
	  countQ++;
	  t = data[x];
	  data[x] = data[y];
	  data[y] = t;
	  x++;
	  y--;
	}
    } 
  while (x <= y);
  {
    if (head < y)
      quick_sort(data, head, y);
    if (x < tail)
      quick_sort(data, x, tail);
  }
}

box
記事: 2002
登録日時: 13年前

Re: クイックソートについて

#2

投稿記事 by box » 8年前

野球君 さんが書きました:•異なる乱数で初期化された配列
そもそも、この条件を満たしていますか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: クイックソートについて

#3

投稿記事 by box » 8年前

クイックソートを非再帰バージョンにすれば、入れ替えの回数をカウントしやすくなるかもしれません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: クイックソートについて

#4

投稿記事 by みけCAT » 8年前

野球君 さんが書きました:クイックソートによる入れ替えの回数を表示する方法が分かりません><
すでにできていそうだと思うのですが…やられているように、入れ替えの回数をカウントして標準出力し、
いい感じの状態(リダイレクトされていないなど)のシェルや端末に表示してもらうのがいいでしょう。
野球君 さんが書きました:このプログラムをどのように改良すれば入れ替えの回数を表示できるか教えていただきたいです><
unsigned int型の変数countの値をprintfで%ldを用いて出力しようとするのは、型が合わないのでundefined behaviorになります。
unsigned int型のデータをprintfで十進数で出力するには、%uを用いてください。
box さんが書きました:
野球君 さんが書きました:•異なる乱数で初期化された配列
そもそも、この条件を満たしていますか?
「異なる乱数で初期化された配列を10個用意して、バブルソートとクイックソートでソートし」なので、
各回のバブルソートとクイックソートで同じ配列を使用するのは仕様通りなのではないでしょうか?
また、a[n]およびb[n]は正しくint[Y]型の配列になっていると思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る