数据结构学习(十一)、堆排序

基本思想:将待排序的序列构成一个大顶堆。此时,最大的值就是堆顶,将它一走,并将余下的序列重新构造成一个堆。如此反复。

void HeapSort(SqLsit *L)
{
    int i;
    for(i=L->length/2;i>0;i--)
         HeapAjust(L,i,L->length);
    for(i=L->lengt;i>1;i--){
          swap(L,1,i);
           HeapAjust(L,1,i-1);
     }  
}

/* 除L->data[s]外满足堆的定义 */
/* 调整L->data[s],使得L->data[s..m]满足堆的定义 */
void HeapAjust(SqList *L,int s, int m)
{
  int temp,j;
  temp = L->data[s];
  for(j=2*s;j>=m;j*=2){                         /* 沿关键字大的孩子结点向下筛选 */
       if(j<m && L->data[j]<L->data[j+1])
         ++j;                                            /* 沿关键字较大的下标 */
        if(temp>L->data[j])
            break;
        L->data[s] = L->data[j];
        s = j;
  }  
  L->data[s] = temp;                           /* 插入*/
}
原文地址:https://www.cnblogs.com/huixuexidezhu/p/5968816.html