一、 堆排序简介
根结点的关键字是堆里所有结点关键字中最小者的堆称为小根堆,又称最小堆。
根结点的关键字是堆里所有结点关键字中最大者,称为大根堆,又称最大堆。
下面,以最大堆为例,对堆排序简单说明。
二、 堆排序示例
堆排序,最大的难点就是调整堆,下面给出代码,已经做了详细的注释。
//调整为最大堆
//a: 数组;start:开始调整堆的位置;len:数组长度
void adjuctHeap(int a[], int start, int len)
{
int left = 2 * start + 1; //节点start的左孩子
int right = 2 * start + 2; //节点start的右孩子
int largest = start; //左右孩子最大值的索引
int tmp = 0; //临时变量,用于交换
while ((left < len) && (right <= len))
{
if (a[largest] < a[left]) //如果小于左孩子,则largest保存为左孩子的索引
{
largest = left;
}
if (right != len) //如果不相等,才执行,相等的话,说明右孩子不存在,不需要比较
{
if ( a[largest] < a[right]) //如果小于右孩子,则largest保存为右孩子的索引
{
largest = right;
}
}
//到这里,说明largest存储的是左右孩子中的最大值的索引,或者本身的索引
if (largest != start) //如果不相等,说明父节点与孩子节点需要交换
{
//父节点与最大值的孩子节点,交换数据
tmp = a[start];
a[start] = a[largest];
a[largest] = tmp;
//start修改为孩子节点索引,进行下一次的循环
start = largest;
left = 2 * largest + 1;
right = 2 * largest + 2;
}
else //如果相等,说明不需要交换,已经符合最大堆的性质,退出循环
{
break;
}
}
}
三、 demo下载