クイックソートがうまくいかない
クイックソートの仕様はこうです。
(1)バラバラにランダムで入力した配列から基準値を設定する。
(2)前から順番に辿って行って基準値よりも大きいならば、基準値よりも後に移動、小さいならば、基準値よりも前に移動させる。(私のプログラムの場合は基準値を配列の一番目の数に設定しています。)
(3)小さいほうと大きいほうの二つのグループに分かれたらまたそれらのグループごとにクイックソートにかける。
(4)二つのグループを分けることができなくなればソート完了。
動作させてみたところ関数QuickSortの中の「基準値より大きいか小さいかの仕分けの処理」の後で、再帰処理があるのですが、再帰ではなく無限ループになってしまっているようです。
自分では、この処理で無限ループをとめているつもりです。
if(youso==1)
{
return;
}
なぜこのようになってしまうのでしょうか
お手数ですが、よろしくお願いいたします。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#define N 10
int k,q;
void QuickSort(char mi,char hai[10],int youso)
{
char shoubox[10];
char bigbox[10];
int i,len,len2;
k=0,q=0;
/*もし配列haiの大きさが1ならば終了*/
if(youso==1)
{
return;
}
/*配列の2番目から最後まで基準値からの大小により仕分けしていく。大きいならば、配列bigboxに小さい*/
/*ならば配列shouboxにそれぞれ入れる。*/
for(i=1;i<youso;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;
}
お礼
更なるお返事が遅くなり,失礼いたしました。 ご質問以来,様々とキーワードを変えたりして,色々Web上で検索した結果,ようやくレジストリーの一部のバックアップで対応できることが分かりました(ソース失念)。 >HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Streams\Desktopキーまで辿る >(TaskbarWinXP(REG_BINARY) この値が並び順です) と言うことらしいです。 このレジストリーをエクスポーとして,必要時にタスクマネージャからExplorerを終了させて,バックアップしたレジストリーをインポートして,Explorerを新規起動させると復元されるらしいです。 ご質問以来,未だ事象が起きていないことから,検証していなかったのですが,ご質問からだいぶ時が経ちましたので,検証してみました。 配列を2,3個移動してみましたが,一部不完全なものの,概ね復旧できる感じでした。 ハデにずれたときに対応できるかは未知ですが,何とかなりそうです。 以前に「デスクトップのアイコン配列が変わったのを元に戻せないか?」と言う質問をさせていただきましたが,その際には復元ソフトがあることを教えていただき,それについては完璧に復元できました。 同じようにクイック起動についてもそのようなソフトがあれば,レジストリーを直接いじらずには済むのですがね。
補足
お返事遅くなりました。 Meまではよくあったのですか。 職場のPCではW2Kが入っていますが,問題は出てないですね。 主観的には,Meは割と不具合が多かったので,2000以降であればOS依存性は無さそうですが。 恐らくはウチのPCの状態がおかしいのでしょうか? その辺を踏まえると,クイックランチの配列順を復旧したりできるユーティリティーなどがあれば良いのですが。