クイックソートにおける、while文の無限ループの可能性と配列数を越えるケースについて
以下は河西朝雄氏:著の
「C言語によるはじめてのアルゴリズム入門」
からのコードを、値をアレンジしてみたものです。
#include <stdio.h>
void quick(int *,int,int);
#define N 5
void main(void)
{
static int a[] = {5,3,1,4,2};
int k;
quick(a,0,N-1);
for(k=0;k<N;k++)
printf("%4d",a[k]);
}
void quick(int a[],int left,int right)
{
int s,t,i,j;
if(left<right){
s=a[left];
i=left;
j=right+1;
while(1){
while(a[++i]<s);
while(a[--j]>s);
if(i>=j)
break;
t=a[i];a[i]=a[j];a[j]=t;
}
a[left]=a[j];a[j]=s;
quick(a,left,j-1);
quick(a,j+1,right);
}
}
(昇順で並べる場合に)今回のように
「軸として設定する先頭要素が、最大の数値」だった時、インデックスiを用いて軸の要素以上の数値を
探索していくことにした際、While文の「while(a[++i]<s);」のところは「下手をしたら無限ループ的に、延々と走査していくことになる可能性もアリなのでは…?」と思えるのですが…?
ボーランド社フリーコンパイラにて
実行し、数値を表示させ確認してみたところ
当方環境下にての最初のiの探索のところは
「a[i]=6566949 iの値=5」となりまして、
この「i=5の箇所はナル文字の箇所のはず…?」と思い、
何故このような扱いとなるのか、わかりません。
ちなみに、配列として渡す引数の中身を
先頭を最小値、降順に並ぶように
コードを変えてもやってみましたところ、
最初のiのところは
「a[i]=-2037199742 iの値=7」となりまして、
完全に配列のインデックスとして用意したものを
越えてしまい…何か、釈然としない感じなのです…。
よろしくお願い致します。