堆排序分为两步:建初始堆和交换堆顶元素和末尾元素并重建堆( 排序) 时间复杂度为O(n) + O(nlgn)即等于O(nlgn)
一、建堆:时间复杂度:O(n)
堆我们正好可以用一个数组来存储,那么它将有如下的关系:
i 表示第i个结点
parent = (i-1) / 2;
Lchild = 2*i + 1;
Rchild = 2*i + 2;
堆建立的时候有两点很重要:
1、必须从最后一个子树往上开始调整
2、每次调整都是从子树的根节点开始向下调整
堆排的代码如下:
//从某一个结点开始调整堆,可调整整个堆也可以调整部分堆,也就是说这个函数用于调整部分是满足堆的特性,部分不满足
void heapfiy(int *tree, int n, int i)//保证每一个子树都是堆(即符合堆的要求) //i表示是第i个结点,n表示结点的个数
{
if(i > n) return ;
int Lchild = 2*i + 1; //下标
int Rchild = 2*i + 2;
int max = i; //要在每个子树中先找到最大值,然后和根节点进行比较,max保存最大值结点的下标
if(Lchild < n && tree[Lchild] > tree[max])
{
max = Lchild;
}
if(Rchild < n && tree[Rchild] > tree[max])
{
max = Rchild;
}
if(max != i)
{