堆排序

PushHeap

//递归
void PushHeap(vector<int>& nums,int index,int length){
    int max = index; 
    int left = index*2+1; 
    int right = index*2+2;
    if(left<length&&nums[left]>nums[max]){
        max = left;
    }
    if(right<length&&nums[right]>nums[max]){
        max = right;
    }
    if(max!=index){
        swap(nums[max],nums[index]);
        PushHeap(nums, max, length);
    }
}
//迭代
void PushHeap(vector<int>& nums,int index,int length){
    int max, left, right;
    while(true){
        max = index;
        left = index*2+1;
        right = index*2+2;
        if(left<length&&nums[left]>nums[max]){
            max = left;
        }
        if(right<length&&nums[right]>nums[max]){
            max = right;
        }
        if(max!=index){
            swap(nums[max],nums[index]);
            index = max;
        }else{
            break;
        }
    }
}

BuildHeap

void BuildHeap(vector<int>& nums){
    int length = nums.size();
    for(int i=length/2-1;i>=0;i--){
        PushHeap(nums,i,length);
    }
}

HeapSort

void HeapSort(vector<int>& nums){
    BuildHeap(nums);
    for(int i=nums.size()-1;i>0;i--){
        swap(nums[0],nums[i]);
        PushHeap(nums,0,i);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值