堆排序 大根堆
阿新 • • 發佈:2021-01-26
#include <iostream>
#include <algorithm>
using namespace std;
#define MAX 100010
int Heap[MAX];
//Heap[i]的孩子是 2*i+1 2*i+2 父親是(i-1)/2
int HeapSize = 0;//初始化堆的大小
void HeapInsert(int Index);//對Index位置上的數進行插入
void Heapify(int Index);
int main(int argc, char** argv)
{
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d", &Heap[i]);
}
//對0 - n-1的數 進行堆插入操作
for(int i = 0; i < n; i++)
{
HeapInsert(HeapSize);
HeapSize++;
}
for(int i = 0; i < n; i++)
{
Heapify(HeapSize);
}
return 0;
}
void HeapInsert( int Index)
{
int Father = (Index-1)/2;
//當這個節點 比 他的父親節點 大的時候
while(Heap[Index] > Heap[Father] )
{
swap(Heap[Index], Heap[Father]);
Index = Father;
Father = (Father-1)/2;
}
}
void Heapify(int Index)
{
printf("%d ",Heap[0]);
swap(Heap[0],Heap[Index]);
HeapSize--;
Index = 0;
while (Index <= HeapSize)
{
int Left = Index*2+1; int Right = Index*2+2;
//沒有孩子 不用交換
if(Left > HeapSize)
{
break;
}
//選出左右孩子的最大位置 注意 左右孩子沒有的情況
int MaxPos = (Right <= HeapSize)&&(Heap[Right]>Heap[Left])
? Right : Left;
MaxPos = Heap[Index] > Heap[MaxPos] ? Index : MaxPos;
if(MaxPos == Index)
{
break;
}
swap(Heap[Index],Heap[MaxPos]);
Index = MaxPos;
}
}