`

《算法之美》---堆排序

 
阅读更多

堆可分为大根堆和小根堆;对小根堆来说,若在输出堆顶的最小值后,使得剩余的n-1个元素的序列重又建成一个小根堆,则得到n个元素中的次小值。如此反复执行,便能得到一个有序序列,这个过程称为堆排序。堆排序只需要一个用来记录大小的辅助空间,每个待排序的记录仅占用一个存储空间。

从一个无序序列建立堆的过程就是一个反复“筛选”的过程,若将此序列看成是一个完全二叉树,则最后一个非终端节点是第(n-1)/2+1个元素,由此“筛选”只需从第(n-1)/2+1个元素开始。

为了使记录序列按关键字非递减有序排列,则在堆排序的算法中先建立一个“大根堆”,即先选得一个关键字为最大的记录并与序列中的最后一个记录交换,然后对序列中前n-1个记录进行筛选,重新将它调整为一个“大根堆”,如此反复直至排序结束。由此,“筛选”应沿关键字较大的孩子节点向下进行。

堆排序方法对记录数较少的文件并不值得提倡,但对n较大的文件还是很有效的。因为其运行时间主要耗费在建立初始堆和调整建立新堆时进行的反复“筛选”上。堆排序在最坏情况下,时间复杂度为O(nlogn),相对于快速排序来说,这是堆排序的最大优点。

堆排序代码模板如下:

/*

函数名: heap_down

功能: 堆排序辅助过程

*/

template <typename T>

void heap_down (T data[], int i, const int& size)

{

int p=i*2+1;

while ( p<size ) //i的左孩子存在

{

if ( p+1<size ) //i的右孩子存在

{

if ( data[p]<data[p+1] ) //沿关键字较大的孩子节点向下筛选

++p;

}

if ( data[i]<data[p] )

{

std::swap(data[p], data[i]);

i=p;

p=i*2+1;

}

else

break;

}

}

/*

函数名: HeapSort

功能: 堆排序

模板参数说明:T必须支持小于操作

参数说明: data待排序数组, size待排序数组大小

前置条件: data!=NULL, size>0

后置条件: data按非降序排列

用法:

#include <algorithm>

int arr[]={10,9,8,4,5,7,6,3,1,4};

HeapSort(arr, 10);

*/

template <typename T>

void HeapSort (T data[], int size)

{

int i;

//data[0size-1]建成大根堆

for (i=(size-1)/2; i>=0; --i)

heap_down(data, i, size);

for (i=size-1; i>0; --i)

{

std::swap(data[0], data[i]); //将堆顶记录data[0]和当前未经排序子序列data[1i]

//最后一个记录data[i]相互交换

heap_down(data, 0, i); //将数组data[0, i-1]重新调整为大根堆

}

}

/*

函数名: heap_down

功能: 堆排序辅助过程

*/

template <typename T, typename Func>

void heap_down (T data[], int i, const int& size, Func& f)

{

int p=i*2+1;

while ( p<size )

{

if ( p+1<size )

{

if ( f(data[p],data[p+1]) )

++p;

}

if ( f(data[i],data[p]) )

{

std::swap(data[p], data[i]);

i=p;

p=i*2+1;

}

else

break;

}

}

/*

函数名: HeapSort

功能: 堆排序

模板参数说明:T元素类型, Func函数对象或指针

参数说明: data待排序数组, size待排序数组大小,函数对象或指针

前置条件: data!=NULL, size>0

后置条件: data按排列

用法:

#include <algorithm>

bool cmp(int a, int b)

{ return a<b; }

int arr[]={10,9,8,4,5,7,6,3,1,4};

HeapSort(arr, 10cmp);

*/

template <typename T, typename Func>

void HeapSort (T data[], int size, Func f)

{

int i;

for (i=(size-1)/2; i>=0; --i)

heap_down(data, i, size, f);

for (i=size-1; i>0; --i)

{

std::swap(data[0], data[i]);

heap_down(data, 0, i, f);

}

}

分享到:
评论

相关推荐

    数据结构与算法之美.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    数据结构与算法分析 C++语言描述 第4版

    书中内容包括表、栈、队列、树、散列表、优先队列、排序、不相交集算法、图论算法、算法分析、算法设计、摊还分析、查找树算法、k-d树和配对堆等。本书把算法分析与C++程序的开发有机地结合起来,深入分析每种算法,...

    算法引论+数据结构与算法分析+代码之美

    《算法引论:一种创造性方法》是国际算法大师乌迪....书的内容包括表、栈、队列、树、散列表、优先队列、排序、不相交集算法、图论算法、算法分析、算法设计、摊还分析、查找树算法、k-d树和配对堆等。

    50个优秀经典PHP算法大集合

    │ │ ├── HeapSort.php 堆排序 大根堆 │ │ ├── MBaseSort.php 基数排序 MSD │ │ ├── LBaseSort.php 基数排序 LSD │ │ ├── QuickSort.php 快速排序 │ ...

    数据结构与算法分析C.描述

    书的内容包括表、栈、队列、树、散列表、优先队列、排序、不相交集算法、图论算法、算法分析、算法设计、摊还分析、查找树算法、k-d树和配对堆等。本书适合作为计算机相关专业本科生的数据结构课程和研究生算法分析...

    数据结构与算法分析:C语言描述

    《数据结构与算法分析:C语言描述》曾被评为20世纪顶尖的30部计算机著作之一,作者在数据结构和算法分析方面卓有建树,他的数据结构和算法分析的著作尤其畅销,并受到广泛好评,已被世界500余所大学...整合了堆排序平...

    Java数据结构与算法中的源代码和applet - 站长下载

    第七章排序算法 第八章集合类型 第九章基于数组的列表集合 第十章链表 第十一章实现LinkedList类 第十二章迭代器 第十三章迭代器的实现 第十四章堆栈 第十五章队列与优先队列 第十六章二叉树 第十七章二叉树的应用 ...

    算法分析导论(美)塞奇威克

     ·移除两章很少讲授的内容:二项堆和排序网络。  ·修订了动态规划和贪心算法相关内容。  ·流网络相关材料现在基于边上的全部流。  ·由于关于矩阵基础和Strassen算法的材料移到了其他章,矩阵运算这一章的...

    python 数据结构 算法 LeetCode 牛客 面试 编程之美 动态规划 字典树等等

    python 数据结构 算法 LeetCode 牛客 面试 编程之美 动态规划 字典树 快速排序 树 字符串 数组 链表 全排列 堆排序 位运算 大数相加

    DataStructure-BeautyOfAlgorithm:《数据结构与算法之美》的学习笔记和python代码实现

    堆17.图的表示18.深度和广度优先搜索19.字符串匹配基础20.Trie树21.AC自动机22.贪心算法23.分治算法24.回溯算法25.动态规划高级篇26.拓扑排序27.有权图的应用:最短路径28.位图&布隆过滤器29.B+树30.索引31.并行算法...

    算法引论:一种创造性方法.[美]Udi Manber(带详细书签).pdf

    6.4.5 堆排序 6.4.6 排序问题的下界 6.5 顺序统计 6.5.1 最大数和最小数 6.5.2 查找第k小的数 6.6 数据压缩 6.7 串匹配 6.8 序列比较 6.9 概率算法 6.9.1 随机数 6.9.2 着色问题 6.9.3 将拉斯维加斯算法...

    《算法精解:C语言描述》(Kyle Loudon[美] 著,肖翔、陈舸 译)

    本书是数据结构和算法领域的经典之作,十余年来,畅销不衰!全书共分为三部分:第一部分首先介绍了数据结构和算法的概念,以及使用它们的原因和意义,然后讲解了数据结构和算法中最常用的技术——指针和递归,最后还...

    常用数据结构和算法的实现及测试

    常用数据结构和算法的实现及测试 1)数据结构包括:堆栈 队列 线性表 链表 2)算法包括:冒泡排序 选择排序 插入排序 希尔排序 归并排序 快排 堆排序 3)其他:随机数产生 计时器的实现

    算法精解(C语言描述)Kyle Loudon 机械工业出版

    本书是数据结构和算法领域的经典之作,十余年来,畅销不衰!全书共分为三部分:第一部分首先介绍了数据结构和算法的概念,以及使用它们的原因和意义,然后讲解了数据结构和算法中最常用的技术——指针和递归,最后还...

    算法:数据结构和算法

    课程来源:《数据结构和算法之美》-作者:王争 复杂度分析 清单 项目 描述 AC自动机 斑点 二叉平衡树 二叉查找树 位图 B +树 B树 组合 完全二叉树 分治算法 动态规划 图 贪心算法 散列表 堆 链表 排序 阴离子 ...

    啊哈!算法(1024ebook.com).pdf

    游戏,在轻松愉悦中便掌握算法精髓,感受算法之美。 本书中涉及到的数据结构有栈、队列、链表、树、并查集、堆和图等;涉及到的算法有排序、枚举、 深度和广度优先搜索、图的遍历,当然还有图论中不可以缺少的四种...

    Java数据结构和算法中文第二版(1)

    堆排序 小结 问题 实验 编程作业 第13章 图 图简介 搜索 最小生成树 有向图的拓扑排序 有向图的连通性 小结 问题 实验 编程作业 第14章 带权图 带权图的最小生成树 最短路径问题 每一对顶点...

    Java数据结构和算法中文第二版(2)

    堆排序 小结 问题 实验 编程作业 第13章 图 图简介 搜索 最小生成树 有向图的拓扑排序 有向图的连通性 小结 问题 实验 编程作业 第14章 带权图 带权图的最小生成树 最短路径问题 每一对顶点...

Global site tag (gtag.js) - Google Analytics