《算法导论(CLRS)》骨灰级笔记分享:堆排序Heapsort
Posted 松子茶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《算法导论(CLRS)》骨灰级笔记分享:堆排序Heapsort相关的知识,希望对你有一定的参考价值。
00 堆排序算法描述
在堆排序算法中,使用的是最大堆。最小堆通常用于构造优先队列。
利用二叉树,先将一个数组构建成一个“最大堆”,保证对每个节点i,它的相邻子节点left和right都小于等于i。这时根节点就是最大的数,将它和最后一个节点互换位置,然后从根节点开始与相邻的子节点比较大小,如果left或right比它大,则互换位置,称为“下移”,直到第n-1个节点,这一轮“下移”之后根节点成为除了最后一个节点之外最大的数,将它和倒数第二个节点互换位置…………循环直到所有节点做完“下移”操作,这时数组已经从小到大排好序了
堆排序关键是先构建“最大堆”,从最后一个节点的父节点开始做“下移”,直到根节点。然后每次“下移”结束后不能将最大值根节点从数组中删除,只能跟最后一个节点互换位置,这样是为了保证二叉树的结构不变,即还是一个“最大堆”,所以堆排序又称为“in place sort”。
01 堆排序笔记
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的主要内容,如果未能解决你的问题,请参考以下文章