`
txf2004
  • 浏览: 6853588 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

《算法导论》第6章 堆排序 (1)最大堆与堆排序

 
阅读更多


6.1 堆

“堆”这个词最初是在堆排序中提出的,但后来就逐渐指“废料收集存储区”,像Lisp和Java中提供的那样。

(二叉)堆是一种数组对象,可以被视为一棵完全二叉树。
length[A]是数组中的元素个数,heap-size[A]是存放在A中堆的元素个数。
树的根是A[1]。

堆的重要函数:
max_heapify
build_max_heap
heapsort

6.2 - 6.4 最大堆

// 将LEFT和RIGHT定义为宏(避免小函数调用的开销)
// 注意宏的定义要加上括号避免文本替换时运算符问题
#include <stdio.h>
#define LEFT(i) (2 * (i))
#define RIGHT(i) (2 * (i) + 1)

// 交换堆中的结点 i 和 j
void exchange(int A[], int i, int j)
{
int tmp = A[i];
A[i] = A[j];
A[j] = tmp;
}

//自结点 i 向下保持最大堆性质。
void max_heapify(int A[], int heapsize, int i)
{
int l, r, largest;
l = LEFT(i);
r = RIGHT(i);

// 确定结点 i, l, r 中最大者
if (l <= heapsize && A[l] > A[i])
largest = l;
else
largest = i;
if (r <= heapsize && A[r] > A[largest])
largest = r;

// 如果结点 i 不是最大者,将其与最大结点largest交换
// 并递归处理结点largest
if (largest != i) {
exchange(A, i, largest);
max_heapify(A, heapsize, largest);
}
}

// 建堆:自底向上,对所有非叶子结点[heapsize/2, 1]
// 调用max_heapify构造出堆性质。
void build_max_heap(int A[], int heapsize)
{
int i;
for (i = heapsize / 2; i >= 1; i--)
max_heapify(A, heapsize, i);
}

// 堆排序:首先建堆,将根结点(最大值)交换到堆尾,
// 将堆大小减1,然后让根结点保持堆性质,
// 因为第一步的交换破坏了堆性质。
void heapsort(int A[], int heapsize)
{
build_max_heap(A, heapsize);
int i;
for (i = heapsize; i >= 2; i--) {
exchange(A, 1, heapsize);
heapsize -= 1;
max_heapify(A, heapsize, 1);
}
}

// 按堆逻辑结构打印。
void print(int A[], int length)
{
int i, j;
for (i = 1, j = 1; i <= length; i++, j--) {
if (j <= 0) {
printf("\n");
j = i;
}
printf("%d\t", A[i]);
}
printf("\n\n");
}

// 测试建堆和堆排序。
int main(void)
{
int A[20] = { 0, 16, 4, 10, 14, 7, 9, 3, 2, 8, 1 };
int heapsize = 10;

build_max_heap(A, heapsize);
print(A, heapsize);

heapsort(A, heapsize);
print(A, heapsize);

return 1;
}




分享到:
评论

相关推荐

    算法导论中堆排序c++源程序

    算法导论上的堆排序c++源程序||学习分享

    堆排序代码 《算法导论》

    参考《算法导论》这本书写的一个堆排序的代码,我个人是用Visual studio写的。只要一个积分哦

    堆排序算法实现

    根据算法导论第六章实现的堆排序

    堆排序算法导论

    实现算法导论中的堆排序,区别数组以0作为根,算法导论中的实现是以数组1作为根

    【算法导论】排序算法源码

    自学算法导论中前几章,并自己写的排序算法源码包括gtest的测试用例。 详细介绍看我博客 http://blog.csdn.net/ceofit 一、选择法排序、冒泡排序、插入法排序 http://blog.csdn.net/ceofit/article/details/7397020 ...

    堆排序最大堆【算法导论】

    ps:按照书中伪码写成,元素由1开始,故数组中第一位A[0]为填充,并不算在排序中。 for(int i = length; i &gt;= 2;) { temp = A[i]; //交换堆的第一个元素和堆的最后一个元素 A[i] = A[1]; A[1] = temp; i--; //...

    算法导论 快速排序 堆排序 代码 可运行

    算法导论 快速排序 堆排序 算法导论上的算法实现更加精简高效 代码可编译运行测试 加了测试用例 加了注释

    算法导论 第二版 (完整版)

    第6章 堆排序 第7章 快速排序 第8章 线性时间排序 第9章 中位数和顺序统计学 第三部分 数据结构 第10章 基本数据结构 第11章 散列表 第12章 二叉查找树 第13章 红黑树 第14章 数据结构的扩张 第四部分 高级设计和...

    php堆排序(算法导论)

    php堆排序(算法导论)

    堆排序(最大堆修改版)【算法导论】

    上个资源的有效排序下标是由1开始的,0只做了填充作用,这次则由下标0为根节点: for(int i = length; i &gt;= 1;) //最后一个肯定是最小的 { temp = A[i]; //交换堆的第一个元素和堆的最后一个元素 A[i] = A[0]; ...

    堆排序(C#,C++)算法导论

    算法导论第三版第六章内容,作者使用C#与C++两种编程语言实现

    堆排序算法实例

    算法导论上堆排序算法的vc6.0下的Test实例。

    算法导论第三版各种排序算法的c/c++实现

    请参考算法导论第三版英文版Introduction to Algorithms 3rd Edition,本程序为第一章到第八章重要排序等算法的c/c++实现。IDE环境为vc++ 6.0。函数名称与算法导论原文类似。 主要包括: 直接选择排序 归并排序 堆...

    算法导论(第2版)参考答案

     第六章 堆排序(Heapsort)  第七章 快速排序(Quicksort)  第八章 线性时间中的排序(Sorting in Linear Time)  第九章 中值与顺序统计(Medians and Order Statistics)  第三部分(Part III) 数据...

    算法导论 第三版 中文版

    算法导论第三版中文版 pdf高清版 在有关算法的书中,有一些叙述非常严谨,但不够全面;另一些涉及了大量的题材,但又缺乏严谨性。算法导论第三版中文版将严谨性和全面性融为一体,深入讨论各类算法,并着力使这些...

    算法导论排序算法汇总

    算法导论中第二章所有排序的自己模拟,快速排序,堆排序,计数排序,最大最小数,选择第n个数等等

    算法导论 第二版

    第6章 堆排序 第7章 快速排序 第8章 线性时间排序 第9章 中位数和顺序统计学 第三部分 数据结构 第10章 基本数据结构 第11章 散列表 第12章 二叉查找树 第13章 红黑树 第14章 数据结构的扩张 第四部分 高级设计和...

    算法导论中文版

    第6章 堆排序  6.1 堆  6.2 维护堆的性质  6.3 建堆  6.4 堆排序算法  6.5 优先队列  思考题  本章注记 第7章 快速排序  7.1 快速排序的描述  7.2 快速排序的性能  7.3 快速排序的随机化版本  ...

    算法导论-第三版(中文).rar

    第六章 堆排序(Heapsort) 第七章快速排序(Quicksort) 第八章 线性时间中的排序(Sorting in Linear Time) 第九章 中值与顺序统计(Medians and Order Statistics) 第三部分(Part III) 数据结构(Data ...

Global site tag (gtag.js) - Google Analytics