排序算法堆排序

参考:堆排序

1. 堆的数据结构

大顶堆;
在这里插入图片描述

  1. 堆顶的数据大于子节点的数据;
  2. 采用数组存储堆
  3. 父子节点的下标关系:
int child_index;
int fa_index;
fa_index=(child_index-1)/2;
child_index=fa_index*2+1//left
child_index=fa_index*2+2//right

2.维护大顶堆

  1. 找到孩子中较大数字;
  2. 进行交换;
  3. 维护代码
void heapify(vector<int>arr,int n,int i){
//i为维护下标;
int la=i;
int lchild=i*2+1;
int rchild=i*2+2;
if()
int tmp=arr[lchild]>arr[lchild]?lchild:rchild;
if(arr[i]<arr[tmp]){
    swap(arr[tmp],arr[i]);
    heapify(arr,n,tmp);
}
}

3 建堆

  1. 从孩子节点开始,不停往上交换
  2. 代码
for(int i=n/2;i>=0;i--){
heapify(arr,i,n);
}

4.排序

for(int i=n-1;i>0;i--){
sawp(arr[i],arr[0]);
heapfi(arr,i,0);
}

5 整体代码

lc912

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        int size=nums.size();
        for(int i1=size/2;i1>=0;i1--){
            heapify(nums,i1,size);
        }
        for(int j=size-1;j>=1;j--){
            swap(nums[j],nums[0]);
            heapify(nums,0,j);
        }
        return nums;


    }
    void heapify(vector<int>& nums,int i,int n){
        int large=i;
        int lson=i*2+1;
        int rson=i*2+2;
        int tmp;
       if (lson < n && nums[lson] > nums[i]) {
                large = lson;
            } else {
                large = i;
            }
            if (rson < n && nums[rson] > nums[large]) {
                large = rson;
            }
            if (large != i) {
                swap(nums[i], nums[large]);
                i = large;
                heapify(nums,i,n);
            }


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值