排序算法之堆排序
1)基本思想 堆排序的基本思想基于优先队列,对于一个无序数组,首先构造出最小堆,然后每一次删除顶点处最小的元素,这样依次删除就可以得到一个降序排列的数组。在此过程中,如将删除的元素依次赋给一个数组,那么最终得到的是一个增序排列的数组,但是需要额外的数组空间。为了减少空间消耗,可以利用堆删除元素之后并重新构造之后的最后一个位置来存放刚刚删除的元素,最终得到的是一个降序数组。为了得到增序排列的数组,可以将最小堆改为最大堆,即顶点处的元素是最大的,称为maxHeap. 示例如下,首先删除顶点处元素97,并将最后一个元素移至顶点处,并重新构造最大堆: 2)算法实现 1 #include "stdafx.h" 2 #include <iostream> 3 using namespace std; 4 5 void print(int A[], int n) 6 { 7 for(int i = 0; i < n; i++) 8 { 9 cout<<A[i]<<" "; 10 } 11 cout<<endl; 12 } 13 14 void HeapDown(int A[], int i, int n) 15 { 16 int child; 17 int temp = A[i]; 18 for(; 2 * i + 1 < n; i = child) 19 { 20 child = 2 * i