
クイックソートとバブルソートの比較回数と交換回数を確認するため以下のようなプログラムを作成しました。
#include <stdio.h>
#define SIZE 32
short bubble_sort(short s[],int x);
short quick_sort(short s[],int y,int z);
void show(short s[],int n);
short bubble_sort(short s[],int x){ //バブルソート
int i,j,count,sum;
short tmp;
count=0;
sum=0;
for(i=0; i<SIZE; i++){
for(j=i+1; j<SIZE; j++){
count++;
if(s[i] > s[j]){
tmp=s[i];
s[i]=s[j];
s[j]=tmp;
sum++;
}
}
}
show(s,SIZE);
printf("\n比較回数:%d回\n交換回数:%d回\n",count,sum);
}
short quick_sort(short s[],int left,int right){ //クイックソート
int i, j,tmp,count,sum;
int point;
i = left;
j = right;
point = s[(left + right) / 2];
count=0;
sum=0;
while (right!=1) {
count++;
while (s[i] < point)
i++;
count++;
while (point < s[j])
j--;
if (i >= j)
break;
tmp=s[i];
s[i]=s[j];
s[j]=tmp;
i++;
j--;
sum++;
}
show(s,SIZE);
printf("\n比較回数:%d回\n交換回数:%d回\n",count,sum);
if (left < i - 1)
quick_sort(s, left, i - 1);
if (j + 1 < right)
quick_sort(s, j + 1, right);
}
void show(short s[], int n)
{
int i;
for (i = 0; i < n ; i++){
printf("%d ", s[i]);
}
printf("\n");
}
int main(void){
short s[SIZE] ={25,29,1,32,14,22,26,3,15,27,5,7,24,12,31,23,6,20,10,8,18,16,11,30,13,2,4,21,17,19,9,28};
printf("ソート前:\n");
show(s,SIZE);
printf("バブルソート後:\n");
bubble_sort(s,SIZE);
printf("\n");
short t[SIZE] ={25,29,1,32,14,22,26,3,15,27,5,7,24,12,31,23,6,20,10,8,18,16,11,30,13,2,4,21,17,19,9,28};
printf("ソート前:\n");
show(t, SIZE);
printf("ソート中:\n");
quick_sort(t,0,SIZE-1);
printf("クイックソート後:\n");
show(t,SIZE);
}
これを動かして頂ければ分かるとは思いますが、バブルソートの時のような結果(途中経過なしで最終結果と比較回数と交換回数の表示)を
クイックソートでも出したいのですが、うまく出せずに困っています。
どのようにすれば良いのかご指導いただけませんでしょうか?また、実行環境が会社にしかないので、
できれば結果も頂けるとありがたいです。失礼ですみませんがよろしくお願い致します。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
異論もあろうかとは思いますが・・・。
#include <stdio.h>
#define SIZE 32
int compare, exchange; //禁断のグローバル変数にセット
void bubble_sort(short *,int);
void quick_sort(short *,int,int);
void show(short *,int);
int main(void){
short s[SIZE] ={25,29,1,32,14,22,26,3,15,27,5,7,24,12,31,23,6,20,10,8,18,16,11,30,13,2,4,21,17,19,9,28};
short t[SIZE] ={25,29,1,32,14,22,26,3,15,27,5,7,24,12,31,23,6,20,10,8,18,16,11,30,13,2,4,21,17,19,9,28};
printf("ソート前:\n");
show(s,SIZE);
compare = exchange = 0;
bubble_sort(s,SIZE);
printf("バブルソート後:\n");
show(s,SIZE);
printf("\n比較回数:%d回\n交換回数:%d回\n",compare,exchange);
printf("\n");
printf("ソート前:\n");
show(t, SIZE);
compare = exchange = 0;
quick_sort(t,0,SIZE-1);
printf("クイックソート後:\n");
show(t,SIZE);
printf("\n比較回数:%d回\n交換回数:%d回\n",compare,exchange);
return 0;
}
void bubble_sort(short s[],int x){ //バブルソート
int i,j;
short tmp;
for(i=0; compare++,i<SIZE; i++){
for(j=i+1; compare++,j<SIZE; j++){
if(compare++, s[i] > s[j]){
tmp=s[i];
s[i]=s[j];
s[j]=tmp;
exchange++;
}
}
}
}
void quick_sort(short s[],int left,int right){ //クイックソート
int i,j,point;
short tmp;
i = left;
j = right;
point = s[(left + right) / 2];
while (compare++, right!=1) {
while (compare++, s[i] < point)
i++;
while (compare++, point < s[j])
j--;
if (compare++, i >= j)
break;
tmp=s[i];
s[i++]=s[j];
s[j--]=tmp;
exchange++;
}
if (compare++, left < i - 1)
quick_sort(s, left, i - 1);
if (compare++, j + 1 < right)
quick_sort(s, j + 1, right);
}
void show(short s[], int n){
int i;
for (i = 0; i < n ; i++){
printf("%d ", s[i]);
}
printf("\n");
}
No.2
- 回答日時:
quick_sort()の中で、
・countとsumをstaticにする
・countとsumをゼロで初期化しているのをやめる
こうすることで、quick_sort()を再帰的に実行しても
「countとsumを毎回ゼロで初期化する」ことがなくなります。
No.1
- 回答日時:
quick_sortは再帰呼び出しされているので、それを考慮してカウントしないとダメです。
あと、クイックソートにおける比較回数の対象が不明確なので、適当に解釈しました。
#include <stdio.h>
#define SIZE 32
void bubble_sort(short s[],int x);
//short quick_sort(short s[],int y,int z);
void quick_sort(short s[],int y,int z, int *count, int *sum);
void show(short s[],int n);
void bubble_sort(short s[],int x){ //バブルソート
int i,j,count,sum;
short tmp;
count=0;
sum=0;
for(i=0; i<SIZE; i++){
for(j=i+1; j<SIZE; j++){
count++;
if(s[i] > s[j]){
tmp=s[i];
s[i]=s[j];
s[j]=tmp;
sum++;
}
}
}
show(s,SIZE);
printf("\n比較回数:%d回\n交換回数:%d回\n",count,sum);
}
void quick_sort(short s[],int left,int right, int *count, int *sum){ //クイックソート
int i, j,tmp/*,count,sum*/;
int point;
i = left;
j = right;
point = s[(left + right) / 2];
//count=0;
//sum=0;
while (right!=1) {
(*count)++;
while (s[i] < point) {
i++;
(*count)++;
}
(*count)++;
while (point < s[j]) {
j--;
(*count)++;
}
(*count)++;
if (i >= j)
break;
tmp=s[i];
s[i]=s[j];
s[j]=tmp;
i++;
j--;
(*sum)++;
}
//show(s,SIZE);
//printf("\n比較回数:%d回\n交換回数:%d回\n",count,sum);
if (left < i - 1)
quick_sort(s, left, i - 1, count, sum);
if (j + 1 < right)
quick_sort(s, j + 1, right, count, sum);
}
void show(short s[], int n)
{
int i;
for (i = 0; i < n ; i++){
printf("%d ", s[i]);
}
printf("\n");
}
int main(void){
int count=0;
int sum=0;
short s[SIZE] ={25,29,1,32,14,22,26,3,15,27,5,7,24,12,31,23,6,20,10,8,18,16,11,30,13,2,4,21,17,19,9,28};
short t[SIZE] ={25,29,1,32,14,22,26,3,15,27,5,7,24,12,31,23,6,20,10,8,18,16,11,30,13,2,4,21,17,19,9,28};
printf("ソート前:\n");
show(s,SIZE);
printf("バブルソート後:\n");
bubble_sort(s,SIZE);
printf("\n");
printf("ソート前:\n");
show(t, SIZE);
printf("ソート中:\n");
quick_sort(t,0,SIZE-1, &count, &sum);
printf("\n比較回数:%d回\n交換回数:%d回\n",count,sum);
printf("クイックソート後:\n");
show(t,SIZE);
}
純粋なC環境だとエラーになるので、main関数内の変数宣言は前に動かしています。
値を返していない2つの関数も型をvoidに変更してます。
上記を実行した結果は
バブルソート
比較回数:496回
交換回数:271回
クイックソート
比較回数:290回
交換回数:45回
間違ってたらごめんなさい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
C# 除算
-
「指定されたキャストは有効で...
-
再帰呼び出し
-
数値をuchar型に入れるには???
-
C言語での引数の省略方法
-
アスタリスクでダイヤ型を作る
-
C言語 エラーの原因がわからな...
-
C言語について教えてください。
-
cプログラミングについて…
-
(int *)の意味
-
課題なんですが・・・
-
表示をクリアする方法
-
c言語の問題です
-
C言語 探索に関して
-
acceptをalarmでタイムアウトさ...
-
プログラミング
-
初項a_0=aとし、漸化式 a_n+1=(...
-
入力された数字を大きい順に並...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
C言語 エラーの原因がわからな...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
int型の変数値をバイト列として...
-
std::set<int> で、ある値が何...
-
PowerShellがうまくいかない
-
(int *)の意味
-
CStringの配列要素を関数で受け...
-
ColorをRGBで指定する方法
-
「{ } で囲むだけ」は正しい?
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
read関数をノンブロッキングで...
-
(マルチスレッド)_beginthrea...
-
int16_t の _t は何?
おすすめ情報