import java.util.Arrays;
/**
* 堆排序
*
* 1、构建最大堆。
* 2、选择顶,并与第0位置元素交换
* 3、由于步骤2的的交换可能破环了最大堆的性质,第0不再是最大元素,需要调用maxHeap调整堆(沉降法),如果需要重复步骤2
*
* 动画演示地址:
*
* https://www.cs.usfca.edu/~galles/visualization/HeapSort.html
*
*/
public class HeapSort {
public int[] sort(int[] sourceArray){
int[] arr= Arrays.copyOf(sourceArray,sourceArray.length);
int len=arr.length;
//构建大站堆
buildMaxHeap(arr,len);
//
for(int i=len-1;i>=0;i--){
swap(arr,0,i);
len--;
heapify(arr,0,len);
}
return arr;
}
//构建大站堆
private void buildMaxHeap(int[] arr,int len){
for(int i=(int)Math.floor(len/2);i>=0;i--){
heapify(arr,i,len);
}
}
//堆的比较方法
private void heapify(int[] arr,int i,int len){
int left=2*i+1;
int right=2*i+2;
int largest=i;
//左子树大于根节点,将左子树和根节点进行交换
if(left<len && arr[left] >arr[largest]){
largest=left;
}
//右子树大于根节点,将右子树和根节点进行交换
if(right<len && arr[right]>arr[largest]){
largest=right;
}
//如果根节点发生变化,就进行转化,并继续比较,直到不发生变化为止
if(largest!=i){
swap(arr,i,largest);
heapify(arr,largest,len);
}
}
//交换函数
private void swap(int[] arr,int i,int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
public static void main(String[] args) {
int[] resourceArray={12,23,234,33334,34,34,2234,56,34,34,567,443};
HeapSort heapSort=new HeapSort();
Arrays.stream(heapSort.sort(resourceArray)).forEach(System.out::println);
}
}