堆排序的过程是首先建立小顶堆(或者大顶堆),这个堆的特征是根节点不大于(或者不小于)任何子节点。建立之后就可以通过每次取出堆中的第一个元素(这个堆的最小值或最大值)然后将新的堆调整从而下次再取第一个这种循环操作来得到一个有序的序列。
在建立堆的过程中都是从最后一个根节点开始,因为纯叶子节点不用处理,它已经是小顶堆了(因为没有子节点所以也满足特征),处理完一个根节点,就接着处理上一个一直到第一个元素。
堆的调整过程是首先把最后一个元素放到第一个元素位置处(因为第一个我们已经取出来了),之后从第一个元素开始“下沉”,下沉的意义是把大的数往下移这样处理完一遍之后首元素又是这个堆中的最小值了,我们再取出来。
我比较了堆排序与冒泡排序的性能,打印了时间戳。在数据量比较大的时候确实差的很多,一个O(N*logN)一个O(N*N)嘛。
具体code如下所示:
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <stdio.h>
void heap_down(unsigned int* a, int i, int n)
{
unsigned int tmp = a[i];
int j = (i << 1) + 2;
if ((j - 1) >= n)