DreamWorks

Never say Never。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

堆排序

Posted on 2013-07-23 18:22  _Babyface  阅读(124)  评论(0编辑  收藏  举报
//堆排序---大根堆
//此过程只排出第一个大根堆
void HeapAdjust(int data[],int s,int m)
{
    //data[s..m]组成的元素序列中,除data[s]之外,其余元素均满足堆定义
    //调整data[s]的位置,使之成为大根堆
    int j,t;
    t = data[s];                                //备份元素data[s],找到合适的位置后再插入
    for (j=2*s+1;j<m;j=j*2+1)                    //沿值较大的孩子节点往下筛选
    {
        if(j<m && data[j]<data[j+1])            //j是较大的元素的下标
            ++j;
        if(!(t<data[j]))
            break;    
        data[s] = data[j];
        s = j;
    }
    data[s] = t;
}
//用堆排序对整形数组进行非递减排序
//对n个数组元素进行排序
void HeapSort(int data[],int n)    
{
    int i;
    int t;
    for(i=n/2-1;i>=0;--i)                        //把data调整成大根堆
        HeapAdjust(data,i,n-1);
    for (i=n-1;i>0;--i)
    { 
        t = data[0];
        data[0] = data[i];
        data[i] = t;                            //堆顶元素data[0]与序列的最后元素data[i]交换
        HeapAdjust(data,0,i-1);                    //带排元素个数减一,将data[0...i-1]调整为大根堆
    }
}
View Code