排序-堆排序-数据结构(32)

来源:互联网 发布:javascript array 编辑:程序博客网 时间:2024/05/21 10:19

一、堆的定义

n[i]<=n[2i] && n[i]<=n[2i+1]。其实堆的概念就是完全二叉树了。i结点的左孩子结点是2i,右孩子是2i+1。

二、解决堆所面临的两个问题

1、//问题一:无序序列建立一个堆

void HeapSort(){//建成了堆 for (int i = length/2; i > 0; --i){//从非终端结点开始筛选HeapAdjust(i,length);}for (int i = length; i>1; --i){//输出堆顶元素 然后进行筛选Swap(1,i);//对剩下的进行筛选HeapAdjust(1,i-1);}}

2、/问题二:如何在输出堆顶元素之后,调整剩余元素成为一个新的堆

void HeapAdjust(int s,int m){int rc = sqTable[s];for (int j= 2*s ; j <= m; j*=2){if (j<m&& sqTable[j]<sqTable[j+1]){j++;//j为儿子中较大的下标}if (rc < sqTable[j]){break;}//往下移动一格sqTable[s] = sqTable[j];s = j;}sqTable[s] = rc;}