package cn.sort.heap;
import cn.sort.utils.ArrayUtils;
/**
* Created by zzh on 2015/6/21.
*/
public class HeapSort {
public static void main(String[] args) {
int[] a = {2,1,5,4,8,6};
System.out.println("before");
ArrayUtils.printArray(a);
heapSort(a);
System.out.println();
System.out.println("after");
ArrayUtils.printArray(a);
}
public static void heapSort(int[] arr) {
if (arr == null || arr.length <= 1) {
return;
}
//大根堆建立完成
buildMaxHeap(arr);
// ArrayUtils.printArray(arr);
for (int i = arr.length - 1; i >= 1; i--) {
//交换可能破环了最大堆的性质,第0不再是最大元素,需要调用maxHeap调整堆(沉降法)
ArrayUtils.swap(arr, 0, i);
maxHeap(arr, i, 0);
}
}
/**
* 建立最大堆
* @param arr
*/
private static void buildMaxHeap(int arr[]) {
if (arr == null || arr.length <= 1) {
return;
}
int half = arr.length / 2;
for (int i = half; i >= 0; i--) {
maxHeap(arr, arr.length, i);
}
}
/**
* 单个节点建立大根堆,递归
* @param arr 数组
* @param heapSize 数组大小
* @param index 节点角标
*/
private static void maxHeap(int arr[], int heapSize, int index) {
//左子节点
int left = index*2 + 1;
//右子节点
int right = index/2 + 2;
//最大的
int largest = index;
if (left < heapSize && arr[left] > arr[largest]) {
largest = left;
}
if (right < heapSize && arr[right] > arr[largest]) {
largest = right;
}
if (index != largest) {
ArrayUtils.swap(arr, index, largest);
maxHeap(arr, heapSize, largest);
}
}
}
java实现堆排序
最新推荐文章于 2024-09-10 10:21:38 发布