クイックソートとはこういう仕様のソートのことです。
(1)バラバラの配列から基準値を設定する。
(2)前から順番に辿って行って基準値よりも大きいならば、基準値よりも後に移動、小さいならば、基準値よりも前に移動させる。(私のプログラムの場合は基準値を配列の一番目の数に設定しています。)
(3)小さいほうと大きいほうの二つのグループに分かれたらまたそれらのグループごとにクイックソートにかける。
(4)二つのグループを分けることができなくなればソート完了。
自分で確かめてみたのですが、どうやら関数QuickSortの中でさらに再帰的にQuickSortにかけるときにバグが発生しているようです。ですが、なぜバグが起きるのかわかりません。
お手数ですが、よろしくお願いいたします。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#define N 10
void QuickSort(char mi,char *hai,int youso)
{
char *shoubox;
char *bigbox;
int k=0;
int q=0;
int i,len,len2;
/*もし配列haiの大きさが1ならば終了*/
if(strlen(hai)==1)
{
return;
}
/*配列の2番目から最後まで基準値からの大小により仕分けしていく。大きいならば、配列bigboxに小さい*/
/*ならば配列shouboxにそれぞれ入れる。*/
for(i=1;i<youso-1;i++)
{
if(hai[i]>mi)
{
bigbox[k++]=hai[i];
}
else
{
shoubox[q++]=hai[i];
}
}
/*仕分け処理はここまで*/
/*小さいほうの配列と大きいほうの配列をそれぞれクイックソートにかける再帰処理。*/
QuickSort(shoubox[0],shoubox,q);
QuickSort(bigbox[0],bigbox,k);
/*それぞれのソートが完了したら、配列haiに「小さいほうの配列」→「基準値」→「大きいほうの配列」
の順に値を代入していく。*/
len=strlen(shoubox);
for(i=0;i<len;i++)
{
hai[i]=shoubox[i];
}
hai[len]=mi;
len2=strlen(bigbox);
for(i=(len+1);i<len+len2;i++)
{
hai[i]=bigbox[i];
}
/*代入処理ここまで。*/
}
int main(void)
{
char array[N];
char m;
int i,val,j;
srand(time(NULL));
/*(1~10)までの数字をランダムに入力する処理*/
for(i=0;i<N;i++)
{
do{
val=rand()%10;
for(j=0;j<i;j++)
{
if(val+'0'==array[j])
{
break;
}
}
}while(j<i);
array[i]=val+'0';
}
/*ランダムに値を入力する処理ここまで*/
m=array[0]; /*値配列の最初を基準値mに設定*/
QuickSort(m,array,N); /*基準値、配列、要素数を実引数として、クイックソートを呼び出す。*/
/*昇順に並べ替えた配列arrayを出力する。*/
for(i=0;i<N;i++)
{
printf("array[%d]=%c\n",i,array[i]);
}
return 0;
}
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
突込みどころ満載だけど
・strlen でいいの?
・shoubox, bigbox に値を設定してないけどいいの?
あたりが最初かな. 動作には関係ないものの「コメントと実際の動作が違う」とか「どうでもいいけどネーミングセンスが問われる」とかもあるなぁ.
No.2
- 回答日時:
パッと見た感じですが、気になるところを何点か。
・要素数をyousoではなく、わざわざstrlenする理由。
・<,>,<=,>=とforの継続条件でしたっけ?が正しいかの確認。
・%10<-10で割った時の剰余です。
私もまだまだ理解できてない部分が多いので間違っていたら申し訳ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelVBAで質問です。離れた二...
-
配列を使わずに、変数名を動的...
-
先頭アドレスとは何ですか?
-
C言語で特定列だけを抽出して配...
-
C言語 配列の長さの上限
-
2次元配列を戻り値とする関数?
-
Excel、VBAのユーザーフォーム...
-
テキストファイルから文字列を...
-
アルファベットの配列を数字の...
-
C言語 配列の再初期化
-
#N/Aを含む列の最小値の求め方
-
構造体配列を引数とするDLL作成...
-
配列で格納したものをmsgboxで...
-
C言語初心者 構造体 課題について
-
C# Listを使わずに2次元配列の...
-
パイソンの
-
なぜ配列は0から始まるのです...
-
配列の参照渡しで型が一致しま...
-
複数の選択範囲の行番号を個別...
-
C言語の配列のサイズ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
配列で格納したものをmsgboxで...
-
配列の参照渡しで型が一致しま...
-
C# Listを使わずに2次元配列の...
-
VBで構造体の配列を関数に渡す...
-
複数の選択範囲の行番号を個別...
-
パイソンの
-
先頭アドレスとは何ですか?
-
【速いブラインドタッチ】手を...
-
C# 配列の変数宣言について。
-
C言語初心者 ポインタについて...
-
unsigned char配列への入力の仕方
-
テキストファイルから文字列を...
-
ExcelVBAで質問です。離れた二...
-
Redimした動的配列はEraseする...
-
C言語で特定列だけを抽出して配...
-
擬似コード 長さがmの配列でな...
-
メモリの初期値
-
C言語初心者 構造体 課題について
おすすめ情報