堆排序练习代码

来源:互联网 发布:深圳 百创装饰 知乎 编辑:程序博客网 时间:2024/06/03 23:46

练习题目:递增堆排序(算法)

相关介绍:

堆排序(Heapsort)是指利用这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

最大堆是二叉堆的两种形式之一。 根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆,又称最大堆


最大堆,将角标i的结点与其两个子结点构成“局部最大堆,如果发生了父结点和子结点交换,则对被交换的子结点位置继续向下递归构建最大堆。函数执行后,该结点与其子树则构成完整的最大堆。其时间复杂度为O(lgn)。

<span style="font-size:14px;">/// Make i node and its subtrees a max-heap treevoid Max_Heapify(int* a, int size, int i){int l = 2 * i, r = 2 * i + 1;int largest = i;int exchange;//Compare with left childif (l<size&&a[l]>a[i])largest = l;elselargest = i;//Compare with right childif (r<size&&a[r]>a[largest])largest = r;//It need to exchange with child nodeif (largest != i){exchange = a[i];a[i] = a[largest];a[largest] = exchange;//Make exchanged node and its subtrees a max-heap treeMax_Heapify(a, size, largest);}}</span>


将无序的数组构建为最大堆。从最后一个元素的父结点开始向上遍历,对每个结点执行Max_Heapify函数。时间复杂度为O(nlgn)。

<span style="font-size:14px;">/// Build a max-heap treevoid 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 sortvoid 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>





0 0
原创粉丝点击