堆排序是在编程中经常用到的东西,在c++的STL底层里面有make_heap, push_heap, pop_heap 和 sort_heap四个接口函数,我们用到的最多的是STL中的priority_queue,其中的底层也是利用前面几个函数实现的。下面我们就自己实现以下堆排序,主要包括调整堆结构,构造堆和堆排序几个接口函数。
#include <iostream>
using namespace std;
void Adjust_Heap(int array[], int p, int N)
{
int parent, child;
for (parent = p; (parent * 2+1) < N; parent = child)
{
child = parent * 2 + 1;
if (child != N - 1 && array[child] < array[child + 1])
child++;
if (array[parent] >= array[child])
break;
else
swap(array[parent], array[child]);
}
}
void Build_Heap(int array[], int N)
{
for (int i = N / 2 - 1; i >= 0; i--)
Adjust_Heap(array, i, N);
}
void Heap_Sort(int array[], int N)
{
Build_Heap(array, N);
for (int i = N - 1; i >= 0; i--)
{
swap(array[0], array[i]);
Adjust_Heap(array, 0, i);
}
}
int main()
{
int array[1000];
for (int i = 0; i < 1000; i++)
array[i] = rand() % 10000;
Heap_Sort(array, 1000);
return 0;
}
代码在主函数随机生成1000个0-10000的数进行堆排序,可以直接运行查看结果。