一.概念
堆排序是利用堆这种数据结构来进行排序的一种算法,时间复杂度为O(nlogn).
二.重要性质及思路
大根堆:
1.完全二叉树
2.父节点的键值>子节点的键值
我们用数组来存储要进行排序的数据,例如:
int tree[] = {1,3,5,7,8,10,9,2,4,6};
这是随机的一组数。
把它用二叉树表示:
这时这个二叉树是无序的,我们需要把它变成大根堆
要使父节点>子节点
对于每个有孩子的节点,若孩子>父节点,把孩子与父节点进行交换。-------------------------一次heapify操作
观察二叉树可知,对于i,其leftchild = 2 * i + 1;
rightchild = 2 * i + 2;
parent = (i -1) / 2;
要对整个二叉树进行heapify操作
只需tree[0] 到 tree[5] 进行heapify形成大堆,而tree[5]正好是最后节点的父节点。
三.C代码实现
-定义交换的函数
void swap(int tree[],int i ,int j) //对tree[i] 和 tree[j] 进行交换
{
int temp = tree[i];
tree[i] =