堆排序:
堆的定义:
一个序列R[1…n],关键字分别为k1、k2、… 、kn。
该序列满足如下性质(简称为堆性质):
① ki≤k2i 且ki≤k2i+1 (即结点的左右孩子均大于该节点-----又称最小堆)
或 ② ki≥k2i 且ki≥k2i+1 (1≤i≤ | n/2 |)(即结点的左右孩子均小于该节点-----又称最大堆)
满足第①种情况的堆称为小根堆 ,满足第② 种情况的堆称为大根堆。下面讨论的堆是大根堆。
大根堆 对应的完全二叉树中,任意一个结点的关键字都大于或等于它的孩子结点的关键字。
最小关键字的记录一定是某个叶子结点!!!
堆排序思想:
① 对一组待排序的记录,按堆的定义建立堆;
② 将堆顶记录和最后一个记录交换位置,则前n-1个记录是无序的,而最后一个记录是有序的;
③ 堆顶记录被交换后,前n-1个记录不再是堆,需将前n-1个待排序记录重新组织成为一个堆,
然后将堆顶记录和倒数第二个记录交换位置,即将整个序列中次小关键字值的记录调整(排除)出无序区;
④ 重复上述步骤,直到全部记录排好序为止。
结论: 排序过程中,若采用小根堆,排序后得到的是递减序列;若采用大根堆,排序后得到的是递增序列。
堆排序的关键:
① 如何由一个无序序列建成一个堆?
② 如何在输出堆顶元素之后,调整剩余元素,使之成为一个新的堆?
堆的调整——筛选:
堆的调整思想:
输出堆顶元素之后,以堆中最后一个元素替代之;然后将根结点值与左、右子树的根结点值进行比较,并与其中小者进行交换;重复上述操作,直到是叶子结点或其关键字值小于等于左、右子树的关键字的值,将得到新的堆。称这个从堆顶至叶子的调整过程为“筛选”,如图10-10所示。
输出堆顶元素之后,以堆中最后一个元素替代之;然后将根结点值与左、右子树的根结点值进行比较,并与其中小者进行交换; 重复上述操作,直到是叶子结点或其关键字值小于等于左、右子树的关键字的值,将得到新的堆。称这个从堆顶至叶子的调整过程为“筛选”,如图10-10所示。
注意:
筛选过程中,根结点的左、右子树都是堆,因此,筛选是从根结点到某个叶子结点的一次调整过程。
来看一个例题:
例:设待排序的表有10个记录,其关键字分别为{6,8,7,9,0,1,3,2,4,5}。说明采用堆排序方法进行排序的过程。
排序序列:6,8,7,9,0,1,3,2,4,5
上面的那个第一次建堆的图形是怎样得到的呢?
下面以图示分解为例:
最大堆的建立过程以及调整过程图系分解:
最小堆的建立过程以及调整过程图系分解:
注意:上面的两个图示过程均为老师所讲内容
下面看一下辅助教科书所讲的方法:
树形选择排序:
借助“ 淘汰赛 ”中的对垒就很容易理解树形选择排序的思想。