关于堆排序概念和具体操作就不说了,自己去百度吧,
直接贴代码了:
首先贴一个工具类,目的是交换数组中指定两个下标的元素以及输出数组元素:
下面只真正的堆排序的实现:
package sort;
import sortUtils.ArrayUtils;
//堆排序:建堆和调整堆
public class HeapSort {
public static void main(String[] args) {
int[] array = { 9, -8, 1, 0, -1, -2, -3 };
buildMaxHeap(array);
heapSort(array);
ArrayUtils.printArray(array);
}
// 堆排序
/**
*
* 1.构建最大堆。
* 2.选择顶,并与第0位置元素交换
* 3.由于步骤2的的交换可能破环了最大堆的性质,第0不再是最大元素,需要调用maxHeap调整堆(沉降法),如果需要重复步骤2
*/
public static void heapSort(int[] array) {
if (array == null || array.length <= 1) {
return;
}
for (int i = array.length - 1; i >= 1; i--) {
ArrayUtils.exchangeElements(array, 0, i);
adjustHeap(array, i, 0);
}
}
public static void buildMaxHeap(int[] array) {
if (array == null || array.length <= 1) {
return;
}
// 关于half 为啥减一,因为数组下标冲零开始计,而总长度从一开始计,差一个数
int half = array.length / 2 - 1;
for (int i = half; i >= 0; i--) {
adjustHeap(array, array.length, i);
}
}
public static void adjustHeap(int[] array, int heapSize, int index) {
int left = index * 2 + 1;
int right = index * 2 + 2;
int largest = index;
if (left < heapSize && array[left] > array[index]) {
largest = left;
}
if (right < heapSize && array[right] > array[largest]) {
largest = right;
}
if (index != largest) {
ArrayUtils.exchangeElements(array, index, largest);
adjustHeap(array, heapSize, largest);
}
}
}