#include <iostream>
using namespace std;
/*
交换
*/
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
/*
调整堆节点,节点值大的"上浮" 小的"下沉"
时间复杂度为O(lgn)
n 堆的大小
index 要调整的节点
*/
void maxHeapify(int a[], int n, int index)
{
int l = 2*index+1;
int r = 2*index+2;
int largest;
if (l<=n-1 && a[l]>a[index])
largest = l;
else
largest = index;
if (r<=n-1 && a[r]>a[largest])
largest = r;
if (largest != index)
{
swap(a[index], a[largest]);
maxHeapify(a,n,largest);
}
}
/*
建立大根堆
*/
void buildMaxHeap(int a[], int n)
{
for (int i=n/2-1; i>=0; --i)
maxHeapify(a,n,i);
}
/*
堆排序
*/
void heapSort(int a[], int n)
{
buildMaxHeap(a,n);
for (int i = n-1; i>=1; --i)
{
swap(a[0], a[i]);
--n;
maxHeapify(a,n,0);
}
}
/*
取得最大值并调整堆
*/
int heapExtractMax(int a[], int n)
{
if(n<1) return -1;
int max = a[0];
a[0] = a[n-1];
--n;
maxHeapify(a,n,0);
return max;
}
/*
改变节点值
*/
void heapIncreaseKey(int a[], int index, int key)
{
if (key<a[index]) return;
a[index] = key;
while(index>1 && a[index/2]<a[index])
{
swap(a[index],a[index/2]);
index /= 2;
}
}
/*
插入节点
*/
void heapInsert(int a[], int n, int key)
{
++n;
a[n-1] = -1;
heapIncreaseKey(a,n,key);
}
int main()
{
//int a[] = {1,2,3,4,5,6};
int a[] = {16,4,10,14,7,9,3,2,8,1};
//maxHeapify(a,10,1);
//buildMaxHeap(a,6);
heapSort(a,10);
return 0;
}