HeapSort implementation (Introduction to Algorithms)

原创 2011年01月10日 14:11:00


// 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);
    }
}

相关文章推荐

introduction to algorithms sorting lesson_6 Counting sort (计数排序)

计数排序 可在

Solution for Introduction to Algorithms (3rd Edition) Exercise 26.4-2

Exercise 26.4-2     Show how to implement the generic push-relabel algorithms using O(V)  time per ...

算法导论(Introduction to Algorithms)之算法入门(插入排序与合并排序C语言实现)

源码下载地址:http://download.csdn.net/detail/mr_dodo/4938878 插入排序: 其算法时间复杂度为C1*n2,C1为一个与n无关的系数,即其算...
  • Mr_dodo
  • Mr_dodo
  • 2012年12月28日 17:29
  • 1196

算法导论(Introduction to Algorithms )— 第二章 算法入门 — 2.1 插入排序

算法导论(Introduction to Algorithms )— 第二章 算法入门 — 2.1 插入排序,及习题拙见...
  • zxnlmj
  • zxnlmj
  • 2014年06月03日 22:47
  • 856

Introduction to Algorithms 算法导论 第2章 算法入门 学习笔记及习题解答

2.1 插入排序 插入排序解决的问题:     输入:n个数构成的序列     输出:排序输入序列为,满足a1' ≤ a2' ≤ ... ≤ an' 伪码: INSERTION...
  • cppgp
  • cppgp
  • 2011年12月29日 15:42
  • 4883

introduction to algorithms data structure lesson_1 stack

前面介绍了各种常见的排序算法,第二部分介绍

麻省理工学院《算法导论》(MIT - Introduction to Algorithms) 视频教学下载地址

ed2k://|file|%5BMIT%E7%AE%97%E6%B3%95%E5%AF%BC%E8%AE%BA.%E8%A7%86%E9%A2%91%5D.1.ocw-6.046-07sep2005-...

[Introduction to Algorithms 学习笔记] 单源最短路径

可以解决那些问题?一般性的问题叙述已知一个带权重的有向图G=(V,E) 和权重函数 ω:E→R (该权重函数将有向图中的每条边)映射他的权重。图中任一路径 p= ...

Introduction to Algorithms 算法导论 第1章 基础知识 学习笔记及习题解答

什么是算法     定义良好的计算过程,取一个或者一组值作为输入,产生一个或一组输出值。 1.1-1 给出一个真实世界的例子,其中包括着下列的某种计算问题:排序,确定多矩阵相乘的最佳顺序,...
  • cppgp
  • cppgp
  • 2011年12月29日 02:05
  • 1324

MERGE-SORT: INTRODUCTION TO ALGORITHMS

Merge sort:归并排序Animation An example of merge sort. First divide the list into the smallest unit (1 ...
  • IOIO_
  • IOIO_
  • 2015年05月31日 13:17
  • 454
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HeapSort implementation (Introduction to Algorithms)
举报原因:
原因补充:

(最多只允许输入30个字)