《算法导论(CLRS)》骨灰级笔记分享:堆排序Heapsort

Posted 松子茶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《算法导论(CLRS)》骨灰级笔记分享:堆排序Heapsort相关的知识,希望对你有一定的参考价值。

00 堆排序算法描述

在堆排序算法中,使用的是最大堆。最小堆通常用于构造优先队列。


利用二叉树,先将一个数组构建成一个“最大堆”,保证对每个节点i,它的相邻子节点left和right都小于等于i。这时根节点就是最大的数,将它和最后一个节点互换位置,然后从根节点开始与相邻的子节点比较大小,如果left或right比它大,则互换位置,称为“下移”,直到第n-1个节点,这一轮“下移”之后根节点成为除了最后一个节点之外最大的数,将它和倒数第二个节点互换位置…………循环直到所有节点做完“下移”操作,这时数组已经从小到大排好序了

堆排序关键是先构建“最大堆”,从最后一个节点的父节点开始做“下移”,直到根节点。然后每次“下移”结束后不能将最大值根节点从数组中删除,只能跟最后一个节点互换位置,这样是为了保证二叉树的结构不变,即还是一个“最大堆”,所以堆排序又称为“in place sort”。


01 堆排序笔记


《算法导论(CLRS)》骨灰级笔记分享:堆排序Heapsort

《算法导论(CLRS)》骨灰级笔记分享:堆排序Heapsort


02 堆排序C语言实现

typedef struct { int *array; int length; int heap_size;} Heap;
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);}
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); }}

-The End-

以上是关于《算法导论(CLRS)》骨灰级笔记分享:堆排序Heapsort的主要内容,如果未能解决你的问题,请参考以下文章

算法导论笔记第6章 堆和堆排序

算法导论(CLRS)答案

算法导论笔记 第8章 线性时间排序

算法导论笔记——第八章 线性时间排序

算法导论第2章参考答案与编程题选

《算法导论》学习摘要chapter-6——堆排序