//时间复杂度 nLogn
import java.util.Arrays;
public class HeapSort {
public static void main(String[] arg){
int[] array = {6, 1, 9, 3, 8, 2, 7, 5, 4, 6, 1};
heapSort(array);
System.out.println(Arrays.toString(array));
}
private static void heapSort(int[] array){
if(array == null || array.length < 2){
return;
}
buildMaxHeap(array);
for (int i = array.length - 1; i >=0; i--) {
int temp = array[i];
array[i] = array[0];
array[0] = temp;
maxHeap(array,i,0);
}
}
/**
* 构建大堆
* @param array
*/
private static void buildMaxHeap(int[] array){
if (array == null || array.length < 2)
return;
int startIndex = (array.length - 1)/2;
for (int i = startIndex; i >= 0 ; i--) {
maxHeap(array,array.length,i);
}
}
/**
* @param array 数组
* @param size 要调整的长度
* @param index 从index开始
*/
private static void maxHeap(int[] array,int size,int index){
if(array == null || array.length < 2){
return;
}
int leftIndex = index * 2 + 1;
int rightIndex = index *2 + 2;
int maxIndex = index;
if(leftIndex < size && array[leftIndex] > array[maxIndex]){
maxIndex = leftIndex;
}
if(rightIndex < size && array[rightIndex] > array[maxIndex]){
maxIndex = rightIndex;
}
if (maxIndex != index) {
int temp = array[index];
array[index] = array[maxIndex];
array[maxIndex] = temp;
maxHeap(array,size,maxIndex);
}
}
}