堆排序实际上是利用了完全二叉树的公式化描述特性,将一个数组以最大堆的方式呈现,并逐一删除其根节点。
几个概念要理解:
假设完全二叉树中一元素的序号为i,1 <= i <= n,则以下关系成立:
1. 当i=1时,该元素为二叉树的根。若i>1,则该元素父节点的编号为i/2(int取整);
2. 当2i>n时,该元素无左孩子,否则,其左孩子的编号为2i;
3. 当2i+1>n时,该元素无右孩子 ,否则,其右孩子的编号为2i+1。
最大树:每个节点的值都大于或等于其子节点值的树。
最大堆:完全二叉树 && 最大树。
MaxHeap.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define RET_TRUE 0
#define RET_FALSE -1
struct MaxHeap {
int *data;
int total_size;
int cur_size;
};
static struct MaxHeap * maxheap_init(int size);
static void maxheap_destroy(struct MaxHeap **heap);
static int maxheap_insert(struct MaxHeap *heap, int ele);
static int maxheap_delete_max(struct MaxHeap *heap, int *ret_ele);
static void swap_int(int *a, int *b)
{
int c &