HeapSort implementation (Introduction to Algorithms)


// push down heap element data[index] in data[0..end]
// array index start with 0 instead of 1 in CLR
void max_heapify(vector<int> &data, int end, int curr_root)
{
    int left_child_idx = curr_root * 2 + 1;
    int right_child_idx = curr_root * 2 + 2;
    int largest_index = curr_root;
    if(left_child_idx <= end && data[largest_index] < data[left_child_idx])
        largest_index = left_child_idx;
    if(right_child_idx <= end && data[largest_index] < data[right_child_idx])
        largest_index = right_child_idx;

    if(largest_index != curr_root)
    {
        std::swap(data[largest_index], data[curr_root]);
        max_heapify(data, end, largest_index);
    }
}

 

/*

index >= size/2 are all leaves, because the child index (size/2 * 2 + 1) is out of bound,

so we can start build heap from the leave nodes

*/

 

 

// make array data[0..end] into a heap
void build_heap(vector<int> &data, int end)
{
    for(int idx = data.size() / 2; idx >= 0; --idx)
        max_heapify(data, end, idx);
}

// 0) heap_size = data.size() - 1;
// 1) make array data[0..heap_size] into a heap
// 2) swap data[0] (max element) to the end
// 3) decrease heap size by 1
// 4) goto 1)
void heapsort(vector<int> &data)
{
    int heap_size = data.size() - 1;
    build_heap(data, heap_size);
    for(int idx = data.size()-1; idx >= 1; --idx)
    {
        std::swap(data[0], data[idx]);
        heap_size--;
        max_heapify(data, heap_size, 0);
    }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值