在介绍堆排序之前,的先介绍一下堆是什么,堆是一种非线性结构,是一颗完全二叉树。
大顶堆,就是指:每个结点的值都大于或等于其左右孩子节点的值,
小顶堆: 每个结点的值都小于或等于其左右孩子结点的值。
大顶堆,小顶堆的形状:
首先当你得到一个数组的时候,它就是一个堆。比如说,我得到的数组是5,4,3,6,9,10,13,12
那么上图就是一个初始堆。然后建立大顶堆,从最后一个父结点开始,建立大顶堆,把最大值改到父结点处。
这是一次建立大顶堆之后的结果,
然后根结点与最后一个叶子结点交换位置,最后一个叶子结点退出排序队列。
迭代,知道所有元素退出排序队列。
#include<iostream>
#include<new>
void swap(int* a, int b, int c);
void buildBigHeap(int* a, int n);
void HeapSort(int* a, int n);
int main()
{
using namespace std;
int n;
cin >> n;
int* a = new int[n];
for (int i = 0; i < n; i++)
cin >> a[i];
HeapSort(a,n);
for (int i = 0; i < n; i++)
cout << a[i] << endl;
return 0;
}
void swap(int* a, int b, int c)
{
int temp = a[b];
a[b] = a[c];
a[c] = temp;
}
void buildBigHeap(int* a, int n)
{
int LastFatherNode = n / 2-1;
for (int i = LastFatherNode; i >= 0; i--)
{
if (a[(i + 1) * 2 - 1] > a[i])
swap(a, (i + 1) * 2 - 1, i);
if((i+1)*2<n && a[(i + 1) * 2] > a[i])
swap(a, (i + 1) * 2 , i);
}
}
void HeapSort(int* a, int n)
{
for (int i = n; i > 0; i--)
{
buildBigHeap(a, i); //建造大顶堆,将最大值放在根结点
swap(a, 0, i - 1); //大顶堆根结点跟未排序的最后一个结点互换。
}
}