<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(); }