堆排序(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)相关推荐

  1. 算法导论读书笔记(7)

    算法导论读书笔记(7) 目录 快速排序 快速排序的简单Java实现 快速排序的性能 最坏情况划分 最佳情况划分 快速排序的随机化版本 比较排序 快速排序 快速排序是一种原地排序算法,对包含 n 个数的 ...

  2. 算法导论读书笔记(8)

    算法导论读书笔记(8) 目录 计数排序 计数排序的简单Java实现 基数排序 基数排序的简单Java实现 桶排序 计数排序 计数排序 假设 n 个输入元素中的每一个都是介于0到 k 之间的整数,此处 ...

  3. 算法导论读书笔记(19)

    http://www.cnblogs.com/sungoshawk/p/3802553.html 算法导论读书笔记(19) 目录 最优二叉搜索树 步骤1:一棵最优二叉查找树的结构 步骤2:一个递归解 ...

  4. 算法导论读书笔记-第十九章-斐波那契堆

    算法导论第19章--斐波那契堆 可合并(最小)堆(mergeable min-heap) : 支持以下5种操作的一种数据结构, 其中每一个元素都有一个关键字: MAKE-HEAP(): 创建和返回一个 ...

  5. 算法导论读书笔记 第4章 分治策略

    在第2章中,归并排序算法使用了分治策略.即在分治策略中,递归地求解一个问题,在每层递归中应包含三个步骤: 分解(Divide)步骤将问题画分为一些子问题,子问题的形式与原问题一样,只是规模更小. 解决 ...

  6. 算法导论读书笔记(20)van Emde Boas树

    第五部分 高级数据结构 第20章 van Emde Boas树 van Emde Boas树支持优先队列操作以及一些其他操作,每个操作最坏情况运行时间为O(lglgn).而这种数据结构限制关键字必须为 ...

  7. 计算机系统导论第九章,计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新)...

    计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新) 第三章 程序的机器级表示 3.1 历史观点 3.2 程序编码 1. 命令行 (1)编译 Linux> gcc -Og ...

  8. 《漫画算法》读书笔记

    <漫画算法>读书笔记 在图书馆借阅算法书时,看到了一本非常吸引我的算法书--<漫画算法>.算法还能以漫画的方式展示出来吗?我带着我的疑惑翻开了这本书,里面的语言非常接地气,通俗 ...

  9. 《BIG DATA大数据日知录 架构和算法》读书笔记

    2019独角兽企业重金招聘Python工程师标准>>> <BIG DATA大数据日知录 架构和算法>读书笔记 博客分类: 架构 分布式计算 1.数据分片和路由 Hash ...

  10. 算法导论学习笔记 第6章 堆排序

    在本章中介绍了另一种排序算法:堆排序(heapsort).与归排序一样,但不同于插入排序的是,堆排序的时间复杂度式(Onlgn).而与插入排序相同,但不同于归并排序的是,堆排序同样具有空间原址性(我理 ...

最新文章

  1. python常用标准库有哪些-Python 200个标准库汇总
  2. 为什么使用pickle模块
  3. 如何把 Word 中的表格快速插入 LaTeX?
  4. sql批量修改字段内容的语句-SQL技巧
  5. linux solrcloud zookeeper分布式集群部署
  6. 同步异步单线程多线程初级理解
  7. log4j 程序日志_使用log4j监视和筛选应用程序日志到邮件
  8. Linux中的MAN命令
  9. python第四周测试答案_Python程序开发第四周作业
  10. oracle显示一个月的所有天数
  11. DevOps使用教程 华为云(17)git 比较2个分支版本的差异 某个具体文件的差异
  12. element-ui使用踩坑记录 2022/8/24
  13. jquery 背景图片幻灯片
  14. 通信原理第三章:窄带随机过程
  15. 用JavaScript写的贪吃蛇游戏(很简单,很详细)
  16. 学生宿舍管理系统(前端部分)
  17. STM32CubeIDE 复制工程
  18. 设置手机静音和固定电话来电时手机震动
  19. javaSwing ATM
  20. 曲面积分的投影法_三重积分的投影法与截面法

热门文章

  1. Oracel中连接的总结(一)
  2. android ConcurrentHashMap的使用
  3. gradle工作流程
  4. 【Redis】17.Cluster集群结构搭建
  5. Android Studio 如何导入第三方jar包(整理)
  6. 数据库性能优化—SQL优化十大原则
  7. 安装nvm管理多版本nodejs
  8. (原)各种输入框美化
  9. kali中wireshark打开后错误
  10. C语言实现简单线程池