博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
堆排序
阅读量:6578 次
发布时间:2019-06-24

本文共 1787 字,大约阅读时间需要 5 分钟。

基本思想:

  堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。
 堆的定义:
  N个元素的序列K1,K2,K3,...,Kn.称为堆,当且仅当该序列满足特性:Ki≤K2i Ki ≤K2i+1(1≤ I≤ [N/2])。

  堆实质上是满足如下性质的完全二叉树:树中任一非叶子结点的关键字均大于等于其孩子结点的关键字。例如序列10,15,56,25,30,70就是一个堆,它对应的完全二叉树如上图所示。这种堆中根结点(称为堆顶)的关键字最小,我们把它称为小根堆。反之,若完全二叉树中任一非叶子结点的关键字均大于等于其孩子的关键字,则称之为大根堆。
  排序过程:
  堆排序正是利用小根堆(或大根堆)来选取当前无序区中关键字小(或最大)的记录实现排序的。我们不妨利用大根堆来排序。每一趟排序的基本操作是:将当前无序区调整为一个大根堆,选取关键字最大的堆顶记录,将它和无序区中的最后一个记录交换。这样,正好和直接选择排序相反,有序区是在原记录区的尾部形成并逐步向前扩大到整个记录区。
  【示例】:对关键字序列42,13,91,23,24,16,05,88建堆。

 

 

大根堆实现:

1 void Swap(int &a, int &b)  2 {
3 a = a + b; 4 b = a - b; 5 a = a - b; 6 } 7 8 // 大堆根 9 void HeapAdjust(int SortData[], int i, int length) 10 {
11 while( (2 * i + 1) < length) 12 {
13 int nMaxChildrenIndex = 2 * i + 1; 14 int nRightChildrenIndex = 2 * i + 2; 15 // 比较左子树与右子树,记录最大值的index 16 if (nRightChildrenIndex < length && SortData[nMaxChildrenIndex] < SortData[nRightChildrenIndex]) 17 {
18 nMaxChildrenIndex = nRightChildrenIndex; 19 } 20 if (SortData[i] < SortData[nMaxChildrenIndex]) 21 {
22 //交换i与MaxChildrenIndex的数据 23 Swap(SortData[i], SortData[nMaxChildrenIndex]); 24 // 堆破环,需要重新调整 25 i = nMaxChildrenIndex; 26 } 27 else 28 break; 29 } 30 } 31 32 void HeapSort(int SortData[], int length) 33 {
34 for (int i = length / 2 - 1; i >= 0; i--) 35 {
36 HeapAdjust(SortData, i, length); 37 } 38 for (int i = length - 1; i > 0; --i) 39 {
40 Swap(SortData[0], SortData[i]); 41 HeapAdjust(SortData, 0, i); 42 } 43 }

转载于:https://www.cnblogs.com/coderyoyo/archive/2011/09/28/heap_sort.html

你可能感兴趣的文章
第二课 HTML+CSS
查看>>
time random sys os模块
查看>>
第一章 台达组态软件的基本介绍
查看>>
DOM_04之常用对象及BOM
查看>>
LOJ#2085 循环之美
查看>>
Leetcode | Longest Common Prefix
查看>>
Filter实现用户自动登录
查看>>
第十九天笔记
查看>>
发送json给服务器
查看>>
日历控件datetimepicker(IE11)
查看>>
RH253读书笔记(5)-Lab 5 Network File Sharing Services
查看>>
CCNP路由实验(4) -- BGP
查看>>
图像卷积与滤波的一些知识点
查看>>
关于 tchart 控件的相关内容
查看>>
(转)新的挑战:敏捷开发与优秀的程序员
查看>>
JS xpath
查看>>
关于 spring MVC 配置自动扫描中 use-default-filters 属性
查看>>
LIUNX 安装 nginx
查看>>
table头部固定,内容滚动
查看>>
插入DOM元素
查看>>