yangyang12138

导航

丰富自己的代码库-堆排序

堆排序是在堆积树的基础上,每次把最下值移动到最后或最前,然后剩下的值继续构造排序树,依次递归直至未排序的序列没有为止,

堆积树是指一颗二叉树满足任意节点不大于叶子节点也就是说根节点的值最小。

使用堆排序的过程为对于一个集合首先构造堆积树,构造过程首先从最后一个节点开始,对于这个节点如果该节点的左子树或右子树不存在则结束,值小于左子树且小于右子树,则此节点构造完毕,如果不小于则跟两个子树中较小的一个交换,然后被交换的子树继续

执行上述操作,直至子树不存在为止。从后向前依次执行上述操作直至第一个节点。则堆积树构造完毕。

选择第一个节点跟最后一个节点交换,然后(0,size-1)继续执行上述构建堆积树操作。直至size为0,排序完毕,

template<class T>
void MinHeapify(T* arr,int size,int index)
{
    int lchild=2*index+1;
    int rchild=lchild+1;
    while(rchild<size)
    {
        if(arr[index]<arr[rchild]&&arr[index]<arr[lchild])
            return;
        if(arr[rchild]>arr[lchild])
        {
            swap(arr[index],arr[lchild]);
            index=lchild;
        }
        else
        {
            swap(arr[index],arr[rchild]);
            index=rchild;
        }
        lchild=index*2+1;
        rchild=lchild+1;
    }
    if(lchild<size&&arr[index]>arr[lchild])
        swap(arr[index],arr[lchild]);
    return;
}
template<class T>
void HeapSort(T* arr,int size)
{
    for(int i=size-1;i>0;i--)
    {
        MinHeapify(arr,size,i);
    }
    for(int i=0;i<size;size--)
    {
        swap(arr[0],arr[size-1]);
        
        MinHeapify(arr,size,0);
    }
}

 

posted on 2016-11-24 14:40  杨杨09265  阅读(127)  评论(0编辑  收藏  举报