十分钟学算法-堆排序

//6. 堆排序(Heap Sort

/*

利用堆设计的排序算法。

堆是一个近似完全二叉树的结构,且满足子节点键值总是小于/大于它的父节点

6.1算法描述

    1.构造初始堆(一般升序大顶堆,降序小顶堆)

    2.将堆顶元素与末尾元素进行交换,使末尾元素最大。size--

    3.重复步骤12。反复执行建堆+交换步骤,直到整个序列有序。

6.2

    最好 ||平均 || 最坏 时间复杂度O(nlogn) //2为底 

    不稳定排序算法

6.3

    大根堆:根结点对应元素最大(小根堆即最小)

*/

建堆

void rebuildheap(vector<int> &nums, int root, int n) //重建堆
{
    //1.初始化:i指向树根
    int i = root, lchild, maxindex = root;
    while (i <= n / 2 - 1)
    {
        lchild = 2 * i + 1; //左子节点 左+1为右子节点   eg.root:0 左1 右2
        if (lchild < n - 1 && nums[lchild] < nums[lchild + 1])
        {
            maxindex = lchild + 1; //右子结点大,记录大的下标
        }
        else
        {
            maxindex = lchild;
        }
        //nums[maxindex]是nums[i]具有较大关键词的子结点
        if (nums[maxindex] > nums[i])
        {
            swap(nums[maxindex], nums[i]);
            i = maxindex; //继续重建堆
        }
        else
        {
            i = n; //终止循环
        }
    }
}

 堆排序

void HeapSort(vector<int> &nums)
{
    //1.初始建堆
    int i;
    for (i = nums.size() / 2 - 1; i >= 0; i--)
    {
        rebuildheap(nums, i, nums.size());
    }
    //2.排序
    for (i = nums.size() - 1; i > 0; i--)
    {
        swap(nums[0], nums[i]);//交换堆顶和末尾元素
        rebuildheap(nums, 0, i);//重建堆
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值