问题描述
用基于变治法的堆排序算法对任意一组给定的数据进行排序
2.1 堆排序原理简介
堆可以定义为一颗二叉树,树的节点中包含键(每个节点是一个键),并且满足下面两个条件:
(1)树的形状要求——这颗二叉树是基本完备的(或者简称为完成二叉树),这意味着,树的每一层都是满的,除了最后一层最右边的元素有可能缺位。
(2)父母优势要求,又称为堆特性——每一个节点的键都要大于或等于它子女的键(对于任何孩子节点也要自动满足父母优势要求)。
2.2 变治法原理简介
变治法:首先,在“变”的阶段,出于这一或者那样的原因,把问题的实例变得更容易求解(PS:类似本文求解问题,在排序前先把数组中数进行成堆处理);然后,在第二阶段或者说“治”的阶段,对实例进行求解。
根据我们对问题实例的变换方式,变治思想有3种主要的类型:
(1)变换为同样问题的一个更简单或者更方便的实例——我们称之为实例化简;
(2)变换为同样实例的不同表现——我们称之为改变表现;
(3)变换为另一个问题的实例,这种问题的算法是已知的——我们称之为问题的化简。
package com.liuzhen.heapsort;
public class HeapSort {
/*将array[a]和array[b]、array[c]中最大值进行比较,如果较小则将array[a]与array[b]、array[c]中最大值
进行交换,否则直接返回数组array*/
public static int[] getMaxA(int[] array,int a,int b ,int c){
int temp = 0;
if(array[b] >= array[c]){
if(array[a] < array[b]){
temp = array[a];
array[a] = array[