<91, 4, 2, 53, 92, 82, 21, 16, 18, 95, 47, 26, 71, 38, 69, 12, 67,
99, 35, 94, >
このデータ列の最小は2で、これを先頭の91と交換すると、次のようになります。*は交換した数値を示します。< >は次に処理をする範囲を示します。
2, < 4, *91, 53, 92, 82, 21, 16, 18, 95, 47, 26, 71, 38, 69, 12, 67,
99, 35, 94, >
次に、< >の内部で同じ処理を行うと、次のようになります。たまたま、4が最小値のため、自分自身と交換しています。
2,* 4, <91, 53, 92, 82, 21, 16, 18, 95, 47, 26, 71, 38, 69, 12, 67,
99, 35, 94, >
これで、ようやく、2番目の数まで整列が終わりました。これを続けると、順に整列ができます。
2, 4, 12, 16, 18, 21, 26, <53, 92, 95, 47, *82, 71, 38, 69, 91, 67,
99, 35, 94, >
n + (n-1) + (n-2) + . . + 3 + 2 + 1
の比較が必要です。これは、(n+1)*n / 2 になります。n=1000のとき、約50万にもなります。
<41, 67, 34, 0, 69, 24, 78, 58, 62, *64, 5, 45, 81, 27, 61, 91, 95,
42, 27, 36, >
を次のように、中央の64より、小さな数と大きな数に分割します。
<41, 36, 34, 0, 27, 24, 42, 58, 62, 61, 5, 45, 27, ><81, 64,
91, 95, 78, 69, 67, >
左< >は64より小さなグループ、右の< >は64より大きなグループです。
<41, 36, 34, 0, 27, 24, *42, 58, 62, 61, 5, 45, 27, >81, 64, 91,
95, 78, 69, 67,
を、中央の42で分割すると、次のように分割出来ます。
<41, 36, 34, 0, 27, 24, 27, 5, ><62, 61, 58, 45, 42, >81,
64, 91, 95, 78, 69, 67,
さらに左の
<41, 36, 34, * 0, 27, 24, 27, 5, >62, 61, 58, 45, 42, 81, 64, 91,
95, 78, 69, 67,
を0で分割すると
0, <36, 34, 41, 27, 24, 27, 5, >62, 61, 58, 45, 42, 81, 64, 91,
95, 78, 69, 67,
となります。今回は、中央の数が0でグループの最小値のため、0と他のグループに分割されます。左の数は0だけのため、もう、分割は不要です。
<41, 67, 34, 0, 69, 24, 78, 58, 62, *64, 5, 45, 81, 27, 61, 91, 95,
42, 27, 36, >
の場合、
<41, 36, 34, 0, 69, 24, 78, 58, 62, *64, 5, 45, 81, 27, 61, 91, 95,
42, 27, 67, >
次に交換をした次の数から同じことを繰り返します。36の右で64より大きな数は69です。67の左で64より小さな数は26です。これを交換します。
<41, 36, 34, 0, 27, 24, 78, 58, 62, *64, 5, 45, 81, 27, 61, 91, 95,
42, 69, 67, >
となります。これを繰返し、左右からの探索が交差したら終了になるます。 center=data[(left+right)/2];//分割する値
i=left;j=right;
do{
while(data[i] < center) i++;
while(data[j] > center) j--;
if( i<=j ){
//TRACE("change %d %d \n",data[i],data[j]);
w=data[i];data[i]=data[j];data[j]=w;
i++;j--;
//m_chg++;
}
} while(i<=j);
if (j>left) QuickSort(left,j); if(i<right) QuickSort(i,right);で、分割処理が出来ます。QuickSort()の内部で、QuickSort()を呼び出しますから再帰処理になります。再帰処理については、再帰計算のページを参照してください。
void exec_actionPerformed(ActionEvent e) {
if(!alive){
proc1=new proc(this);
proc1.start();
alive=true;
exec.setLabel("stop");
stepButton.setEnabled(true);
}
else{
proc1.stopproc();
}
}
synchronized public void waitButton(){
try{
wait();
}catch( InterruptedException e){}
}
synchronized public void step(){
notify();
}