参考网址:http://www.cnblogs.com/eniac12/p/5329396.html#s6
算法描述:
堆排序是指利用堆这种数据结构所设计的一种选择排序算法。堆是一种近似完全二叉树的结构(通常堆是通过一维数组来实现的),并满足性质:以最大堆(也叫大根堆、大顶堆)为例,其中父结点的值总是大于它的孩子节点。
我们可以很容易的定义堆排序的过程:
- 由输入的无序数组构造一个最大堆,作为初始的无序区
- 把堆顶元素(最大值)和堆尾元素互换
- 把堆(无序区)的尺寸缩小1,并调用heapify(A, 0)从新的堆顶元素开始进行堆调整
- 重复步骤2,直到堆的尺寸为1
代码如下:
#include<iostream>
using namespace std;
// 分类 -------------- 内部比较排序
// 数据结构 ---------- 数组
// 最差时间复杂度 ---- O(nlogn)
// 最优时间复杂度 ---- O(nlogn)
// 平均时间复杂度 ---- O(nlogn)
// 所需辅助空间 ------ O(1)
// 稳定性 ------------ 不稳定
void Swap(int arr[], int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
void Heapiy(int arr[], int i, int size) // 从A[i]向下进行堆调整
{
int left_child = 2 * i + 1; // 左孩子索引
int right_child = 2 * i + 2; // 右孩子索引
int max = i; // 选出当前结点与其左右孩子三者之中的最大值
if (left_child < size && arr[left_child] > arr[max])
max = left_child;
if (right_child < size && arr[right_child] > arr[max])
max = right_child;
if (max != i)
{
Swap(arr, i, max);
Heapiy(arr, max, size);
}
}
int BuildHeap(int arr[], int n)
{
int heap_size = n;
for (int i = heap_size / 2 - 1; i >= 0; i--)
{
Heapiy(arr, i, heap_size);
}
return heap_size;
}
void HeapSort(int arr[], int n)
{
int heap_size = BuildHeap(arr, n);
while (heap_size > 1)
{
Swap(arr, 0, --heap_size);
Heapiy(arr, 0, heap_size);
}
}
int main()
{
int arr[] = { 5, 4, 7, 3, 9, 2, 4, 1, 9, 0, 6, 8 };
int len = sizeof(arr) / sizeof(int);
HeapSort(arr, len);
for (int i = 0; i < len; i++)
{
cout << arr[i] << endl;
}
return 0;
}