ch10_ex35 满足完全三叉树的…

来源:互联网 发布:修改https默认端口 编辑:程序博客网 时间:2024/04/28 11:48
10.35③  假设定义堆为满足如下性质的完全三叉树:
(1) 空树为堆;
(2) 根结点的值不小于所有子树根的值,且所有子树
    均为堆。
编写利用上述定义的堆进行排序的算法,并分析推导
算法的时间复杂度。

实现下列函数:
void HeapSort(HeapType &h);

堆(顺序表)的类型HeapType定义如下:
typedef char KeyType;

typedef struct { 
    KeyType key;
    ... ...
} RedType;

typedef struct {
    RedTyper[MAXSIZE+1];
    int    length;
} SqList, HeapType;

比较函数和交换函数:
Status LT(RedType a, RedType b)
  { return a.key
Status GT(RedType a, RedType b) 
  { return a.key>b.key ? TRUE: FALSE; } 
void Swap(RedType &a, RedType&b)
  { RedType c;  c=a; a=b;  b=c; }

答案以及解析:
void HeapAdjust(HeapType &h,int s,intm);
void HeapSort(HeapType &h)
{
    int i = 0;
    i = h.length/3+1;
   for(;i>0;i--)
    {
       HeapAdjust(h,i,h.length);
    }
    for(i =h.length;i>1;i--)
    {
       Swap(h.r[1],h.r[i]);
       HeapAdjust(h,1,i-1);
    }

}
void HeapAdjust(HeapType &h,int s,int m)
{   
    h.r[0] = h.r[s];
    int j;
    for(j =s*3-1;j<=m;j=3*j-1)
    {
       if (j<m-1)
       {   
          if(LT(h.r[j],h.r[j+1]))
           {
              j++;
              if(LT(h.r[j],h.r[j+1]))
                 j++;              
           }
           elseif(LT(h.r[j],h.r[j+2]))
              j+=2;          
       }
       elseif(j<m&&LT(h.r[j],h.r[j+1]))j++;
       if(!LT(h.r[0],h.r[j])) break;
//已经是当前最大值则保留,循环结束,否则寻找子树中最大值,并腾空位置
       h.r[s] = h.r[j];
       s = j;
    }//for
    h.r[s] =h.r[0];//将哨兵元素放在腾空位置即合适位置
}

堆排序方法对记录较少的文件并不值得提倡,但对n较大的文文件还是很有效的。因为其运行时间主要耗费在建初始堆和调整建新堆时进行的反复筛选上。
0 0