练习题目:递增堆排序(算法)
相关介绍:
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
最大堆是二叉堆的两种形式之一。 根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆,又称最大堆
最大堆,将角标i的结点与其两个子结点构成“局部最大堆,如果发生了父结点和子结点交换,则对被交换的子结点位置继续向下递归构建最大堆。函数执行后,该结点与其子树则构成完整的最大堆。其时间复杂度为O(lgn)。
<span style="font-size:14px;">/// Make i node and its subtrees a max-heap tree
void Max_Heapify(int* a, int size, int i){
int l = 2 * i, r = 2 * i + 1;
int largest = i;
int exchange;
//Compare with left child
if (l<size&&a[l]>a[i])
largest = l;
else
largest = i;
//Compare with right child
if (r<size&&a[r]>a[largest])
largest = r;
//It need to exchange with child node
if (largest != i){
exchange = a[i];
a[i] = a[largest];
a[largest] = exchange;
//Make exchanged node and its subtrees a max-heap tree
Max_Heapify(a, size, largest);
}
}</span>
将无序的数组构建为最大堆。从最后一个元素的父结点开始向上遍历,对每个结点执行Max_Heapify函数。时间复杂度为O(nlgn)。
<span style="font-size:14px;">/// Build a max-heap tree
void Build_Max_Heap(int* a, int size){
int i;
for (i = size / 2 - 1; i >= 0; --i){
Max_Heapify(a, size, i);
}
}</span>
堆排序函数。对已经构建好的最大堆进行排序。相应的,递增排序需要构建最大堆,递减排序需要构建最小堆。时间复杂度O(nlgn)。
<span style="font-size:14px;">/// Heap sort
void HeapSort(int* a, int size){
int i;
int exchange;
for (i = size - 1; i >= 0; --i){
exchange = a[i];
a[i] = a[0];
a[0] = exchange;
--size;
Max_Heapify(a, size, 0);
}
}</span>
<span style="font-size:14px;">int main(){
int i;
int a[] = { 1, 56, 32, 42, 78, 60, 0, 23, 100, -6, -20, 56, 27 };
Build_Max_Heap(a, sizeof(a) / sizeof(int));
HeapSort(a, sizeof(a) / sizeof(int));
for (i = 0; i < sizeof(a) / sizeof(int); ++i)
printf("%d ", a[i]);
puts("");
}</span>
<span style="font-size:18px;">-20 -6 0 1 23 27 32 42 56 56 60 78 100 </span>