赞
踩
关于大根堆
什么是大根堆?大根堆是指在树中,存在一个结点而且该结点有儿子结点,该结点的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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。