【CLRS】《算法导论》读书笔记(一):堆排序(Heapsort)
堆排序(Heapsort)
维基百科:http://en.wikipedia.org/wiki/Heapsort
时间复杂度:O(n log n)
示例:
[6, 5, 3, 1, 8, 7, 2, 4]
1、堆(Heap)
维基百科:http://en.wikipedia.org/wiki/Heap_(data_structure)
In computer science, a heap is a specialized tree-based data structure that satisfies the heap property: If A is a parent node of B then key(A) is ordered with respect to key(B) with the same ordering applying across the heap.
PARENT(i)
return i / 2
LEFT(i)
return 2 * i
RIGHT(i)
2 * i + 1
2、Heapify
最大堆为例,伪代码:
MAX-HEAPIFY(A, i)
l = LIFT(i)
r = RIGHT(i)
if l <= A.heapsize and A[l] > A[i]
largest = l
else largest = i
if r <= A.heapsize and A[r] > A[largest]
largest = r
if largest != i
exchage A[i] with A[largest]
MAX-HEAPIFY(A, largest)
3、Build Heap
最大堆为例,伪代码:
BUILD-MAX-HEAP(A)
A.heap-size = A.length
for A.length / 2 downto 1
MAX-HEAPIFY(A, i)
4、Heapsort
最大堆为例,伪代码:
HEAPSORT(A)
BUILD-MAX-HEAP(A)
for i = A.length downto 2
exchange A[1] with A[i]
A.heap-size = A.heap-size - 1
MAX-HEAPIFY(A, 1)
5、Priority Queue
最大堆为例,伪代码:
HEAP-MAXIMUM(A)
return A[1]
HEAP-EXTRACT-MAX(A)
if A.heap-size < 1
error "heap underflow"
max = A[1]
A[1] = A[A.heap-size]
A.heap-size = A.heap-size - 1
MAX-HEAPIFY(A, 1)
return max
HEAP-INCREASE-KEY(A, i, key)
if key < A[i]
error "new key is smaller than current key"
A[i] = key
while i > 1 and A[PARENT(i)] < A[i]
exchange A[i] with A[PARENT(i)]
i = PARENT(i)
MAX-HEAP-INSERT(A, key)
A.heap-size = A.heap-size + 1
A[A.heap-size] = - INFINITY
HEAP-INCREASE-KEY(A, A.heap-size, key)
C语言实现
heap.h
typedef struct {int *array;int length;int heap_size; } Heap;int heap_parent(int index); int heap_left_child(int index); int heap_right_child(int index);
heap.c
int heap_parent(int index) {return (index - 1) / 2; }int heap_left_child(int index) {return 2 * index + 1; }int heap_right_child(int index) {return 2 * (index + 1); }
heap_sort.h
#import "heap.h"void max_heap_sort(Heap heap);
heap_sort.c
#import "heap_sort.h"void exchange(int *a, int *b) {int temp = *a;*a = *b;*b = temp; }void max_heapify(Heap heap, int index) {int largest = index;int left = heap_left_child(index);int right = heap_right_child(index);if (left < heap.heap_size && heap.array[left] > heap.array[right]) {largest = left;}if (right < heap.heap_size && heap.array[right] > heap.array[largest]) {largest = right;}if (largest != index) {exchange(heap.array + largest, heap.array + index);max_heapify(heap, largest);}}void build_max_heap(Heap heap) {int i;for (i = heap.length / 2 - 1; i >= 0; i--) {max_heapify(heap, i);} }void max_heap_sort(Heap heap) {int i;build_max_heap(heap);for (i = heap.length - 1; i > 1; i--) {exchange(heap.array, heap.array + i);heap.heap_size -= 1;max_heapify(heap, 0);} }
main.c
#import <stdio.h> #import "heap_sort.h"int main() {int i;int array[8] = {6, 5, 3, 1, 8, 7, 2, 4};Heap heap = {array, 8, 8};max_heap_sort(heap);for(i = 0; i < heap.length; i++) {printf("%d \n", heap.array[i]);}return 0; }
运行结果:
转载于:https://www.cnblogs.com/dyingbleed/archive/2013/03/04/2941989.html
【CLRS】《算法导论》读书笔记(一):堆排序(Heapsort)相关推荐
- 算法导论读书笔记(7)
算法导论读书笔记(7) 目录 快速排序 快速排序的简单Java实现 快速排序的性能 最坏情况划分 最佳情况划分 快速排序的随机化版本 比较排序 快速排序 快速排序是一种原地排序算法,对包含 n 个数的 ...
- 算法导论读书笔记(8)
算法导论读书笔记(8) 目录 计数排序 计数排序的简单Java实现 基数排序 基数排序的简单Java实现 桶排序 计数排序 计数排序 假设 n 个输入元素中的每一个都是介于0到 k 之间的整数,此处 ...
- 算法导论读书笔记(19)
http://www.cnblogs.com/sungoshawk/p/3802553.html 算法导论读书笔记(19) 目录 最优二叉搜索树 步骤1:一棵最优二叉查找树的结构 步骤2:一个递归解 ...
- 算法导论读书笔记-第十九章-斐波那契堆
算法导论第19章--斐波那契堆 可合并(最小)堆(mergeable min-heap) : 支持以下5种操作的一种数据结构, 其中每一个元素都有一个关键字: MAKE-HEAP(): 创建和返回一个 ...
- 算法导论读书笔记 第4章 分治策略
在第2章中,归并排序算法使用了分治策略.即在分治策略中,递归地求解一个问题,在每层递归中应包含三个步骤: 分解(Divide)步骤将问题画分为一些子问题,子问题的形式与原问题一样,只是规模更小. 解决 ...
- 算法导论读书笔记(20)van Emde Boas树
第五部分 高级数据结构 第20章 van Emde Boas树 van Emde Boas树支持优先队列操作以及一些其他操作,每个操作最坏情况运行时间为O(lglgn).而这种数据结构限制关键字必须为 ...
- 计算机系统导论第九章,计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新)...
计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新) 第三章 程序的机器级表示 3.1 历史观点 3.2 程序编码 1. 命令行 (1)编译 Linux> gcc -Og ...
- 《漫画算法》读书笔记
<漫画算法>读书笔记 在图书馆借阅算法书时,看到了一本非常吸引我的算法书--<漫画算法>.算法还能以漫画的方式展示出来吗?我带着我的疑惑翻开了这本书,里面的语言非常接地气,通俗 ...
- 《BIG DATA大数据日知录 架构和算法》读书笔记
2019独角兽企业重金招聘Python工程师标准>>> <BIG DATA大数据日知录 架构和算法>读书笔记 博客分类: 架构 分布式计算 1.数据分片和路由 Hash ...
- 算法导论学习笔记 第6章 堆排序
在本章中介绍了另一种排序算法:堆排序(heapsort).与归排序一样,但不同于插入排序的是,堆排序的时间复杂度式(Onlgn).而与插入排序相同,但不同于归并排序的是,堆排序同样具有空间原址性(我理 ...
最新文章
- python常用标准库有哪些-Python 200个标准库汇总
- 为什么使用pickle模块
- 如何把 Word 中的表格快速插入 LaTeX?
- sql批量修改字段内容的语句-SQL技巧
- linux solrcloud zookeeper分布式集群部署
- 同步异步单线程多线程初级理解
- log4j 程序日志_使用log4j监视和筛选应用程序日志到邮件
- Linux中的MAN命令
- python第四周测试答案_Python程序开发第四周作业
- oracle显示一个月的所有天数
- DevOps使用教程 华为云(17)git 比较2个分支版本的差异 某个具体文件的差异
- element-ui使用踩坑记录 2022/8/24
- jquery 背景图片幻灯片
- 通信原理第三章:窄带随机过程
- 用JavaScript写的贪吃蛇游戏(很简单,很详细)
- 学生宿舍管理系统(前端部分)
- STM32CubeIDE 复制工程
- 设置手机静音和固定电话来电时手机震动
- javaSwing ATM
- 曲面积分的投影法_三重积分的投影法与截面法