#include <iostream>
#include<stack>
#include<algorithm>
using namespace std;
//调整堆
void HeapAdjust(int a[],int i ,int size){
//i的左孩子节点序号
int lchild = 2*i;
//i的右孩子节点序号
int rchild = 2*i+1;
//临时变量
int max = i;
//非叶子节点,叶子节点无需调整
if(i <= size/2){
if(lchild<=size && a[lchild]>a[max])
max = lchild;
if(rchild<=size && a[rchild]>a[max])
max = rchild;
}
//如果调整过,则将交换过的子节点以下部分继续做heapadjust
if(max!=i){
swap(a[i],a[max]);
HeapAdjust(a,max,size);//继续调整新的
}
}
//构造堆
void BuildHeap(int a[],int size){
//调整所有的非叶子节点
for (int i= size/2; i >=1; i--)
{
HeapAdjust(a,i,size);
}
}
//堆排序
void HeapSort(int a[],int size){
BuildHeap(a,size);
for (int i = size; i >=1; i--)
{
swap(a[i],a[0]);
HeapAdjust(a,0,i-1);
}
}
堆排序-剑指offer
最新推荐文章于 2021-09-12 02:00:44 发布