关于大根堆
什么是大根堆?大根堆是指在树中,存在一个结点而且该结点有儿子结点,该结点的data域值都不小于(大于)其儿子结点的data域值,并且它是一个完全二叉树(不一定是满二叉树)。大根堆的根结点是树中元素最大的。
图-1
另外:大根堆是一个递归概念,在多个子树中,并不是说其中一个子树的父结点一定大于另一个子树的儿子结点。大根堆是树结构,而且一定要是完全二叉树。
#include<stdio.h>
#include<stdlib.h>
// 大根堆-堆排序
void get_heap_max(int *arr, int length) {
//每执行一次最大值都在放置在数组首位
int child, parent;
for (int i = length - 1; i > 0; i--) {
child = i, parent = i / 2;
if (i < length - 1 && arr[i] < arr[i + 1]) {
child++;
}
if (arr[child] > arr[parent]) {
int temp = arr[child];
arr[child] = arr[parent];
arr[parent] = temp;
}
}
}
void pri(int *arr, int length) {
printf("本次元素分布为:");
for (int i = 0; i < length; i++) {
printf("%3d\t", arr[i]);
}
printf("\n");
}
void make_max_heap(int *arr, int length) {
for (int i = length; i > 0; i--) {
get_heap_max(arr, i);
//将每次操作后得到的最大值从首位交换到数组后面去。
int temp = arr[0];
arr[0] = arr[i - 1];
arr[i - 1] = temp;
pri(arr, 9);
}
}
int main() {
int arr[9] = { 3,6,2,4,7,8,9,1,5 };
pri(arr, 9);
make_max_heap(arr, 9);
pri(arr, 9);
return 0;
}