void HeapAdjust ( S_TBL *h,int s,int m ) {/*r[s…m]中的记录关键码除r[s]外均满足堆的定义,本函数将对第s 个结点为根的子树筛选,使其成为大顶堆*/ rc=h->r[s]; for ( j=2*s; j<=m; j=j*2 ) /* 沿关键码较大的子女结点向下筛选*/ { if ( jr[j].keyr[j+1].key ) j=j+1; /* 为关键码较大的元素下标*/ if ( rc.keyr[j].key ) break; /* rc 应插入在位置s 上*/ h->r[s]=h->r[j]; s=j; /* 使s 结点满足堆定义*/ } h->r[s]=rc; /* 插入*/ } void HeapSort ( S_TBL *h ) { for ( i=h->length/2; i>0; i-- ) /* 将r[1..length]建成堆*/ HeapAdjust ( h,i,h->length ); for ( i=h->length; i>1; i-- ) { h->r[1]<-->h->r[i]; /* 堆顶与堆低元素交换*/ HeapAdjust ( h,1,i-1 ); /*将r[1..i-1]重新调整为堆*/ } }