在介绍堆排序之前,的先介绍一下堆是什么,堆是一种非线性结构,是一颗完全二叉树。
大顶堆,就是指:每个结点的值都大于或等于其左右孩子节点的值,
小顶堆: 每个结点的值都小于或等于其左右孩子结点的值。
大顶堆,小顶堆的形状:
首先当你得到一个数组的时候,它就是一个堆。比如说,我得到的数组是5,4,3,6,9,10,13,12
那么上图就是一个初始堆。然后建立大顶堆,从最后一个父结点开始,建立大顶堆,把最大值改到父结点处。
这是一次建立大顶堆之后的结果,
然后根结点与最后一个叶子结点交换位置,最后一个叶子结点退出排序队列。
迭代,知道所有元素退出排序队列。
#include#include 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 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); //大顶堆根结点跟未排序的最后一个结点互换。 } }



