c/c++實現堆排序

堆排序 -

堆排序的思想借助於二叉堆中的最大堆得以實現。首先,將待排序數列抽象爲二叉樹,並構造出最大堆;然後,依次將最大元素(即根節點元素)與待排序數列的最後一個元素交換(即二叉樹最深層最右邊的葉子結點元素);每次遍歷,刷新最後一個元素的位置(自減1),直至其與首元素相交,即完成排序。

時間複雜度:O(NlogN)   穩定性:不穩定

/*堆排序*/
//根節點元素自頂向下移動到合適的位置以構成最大堆
void downToMaxHeap(vector<int> &arr, int bgn, int end)
{
    int child;
    int parent = bgn;

    /*假根節點向下移動至合適的位置 --整個堆排序的核心代碼塊*/
    while ((child = parent * 2 + 1) < end)
    {
        if ((child < end - 1) && (arr[child] < arr[child + 1]))
            ++child;    //右孩子節點
        if (arr[child] > arr[parent])
            mySwap(&arr[child], &arr[parent]);
        else
            break;
        parent = child;
    }
}
//將數組構造爲最大堆
void buildMaxHeap(vector<int> &arr, int bgn, int end)
{
    if (bgn >= end - 1)
        return;

    int parent = end / 2 - 1;
    while (parent >= 0)
    {
        downToMaxHeap(arr, parent, end);
        --parent;
    }
}
//堆排序
void heapSort(vector<int> &arr, int bgn, int end)
{
    //構造最大堆
    buildMaxHeap(arr, bgn, end);

    while (end > 1)
    {
        mySwap(&arr[0], &arr[--end]);
        downToMaxHeap(arr, 0, end);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章