ヒープソート
ヒープは図のように、子供より親の値が大きくなっている木構造です。例えば、62の子供は52と45で、親は子供より大きな値です。左右の子供の大小関係はありません。
ヒープは最終段を除き左右のバランスがとれた構造ですから、配列を利用して簡単に記録できます。要素1の子供を2,3に、2の子供を4,5に、記憶します。一般に、iの要素の子供を2*iと2*i+1の要素に記録します。
void Shift(int L,int R){
int i,j;
int x;
boolean Cont;
i=L;
j=2*i;
Cont=true;
x=data[i];
while( j <= R && Cont){
if (j < R)
if (data[j] < data[j+1]) j++;
if( x >= data[j]) Cont=false;
else {
data[i]=data[j];
i=j;j=2*i;
}
}
data[i]=x;
}
void HeapSort(int data[],int num){
int L,R;
int x;
L=num/2+1;
R=num;
while(L>1){
L--;
Shift(L,R);
}
st+="ヒープ\n";
print(data,num);
while(R>1){
x=data[1];
data[1]=data[R];
data[R]=x;
R--;
Shift(L,R);
}
st+="整列\n";
print(data,num);
}