public class Main {
public static void main(String[] args) {
int[] data = {1, 9, 0, 7, 4, 6};
heapSort(data);
for (int i = 0; i < data.length; i++) {
System.out.println(data[i]);
}
}
/**
* get busy living, or
* @param data
*/
public static void heapSort(int[] data) {
buildMaxHeap(data, data.length);
for (int i = data.length - 1; i >= 0; i--) {
int temp = data[i];
data[i] = data[0];
data[0] = temp;
headAdjust(data, 0, i);
}
}
/**
* what's the meaning of life?
* @param data
* @param len 要调节的数组长度
*/
public static void buildMaxHeap(int[] data, int len) {
for(int i = (len - 1) / 2; i >= 0; i--) {//小于等于(len - 1) / 2才有孩子节点
headAdjust(data, i, len);
}
}
/**
* this is a crazy world, and I am not crazy enough
* 小元素不断下坠
* @param data
* @param k 要调节的位置(数组下标)
* @param len 要调节的长度
*/
public static void headAdjust(int[] data, int k, int len) {
int temp = data[k];
for(int i = 2 * k; i < len; i *= 2) {
if (i + 1 < len && data[i +1] > data[i]) {//找出最大的孩子
i++;
}
if (temp < data[i]) {
data[k] = data[i];
k = i;
} else {
break;//比孩子都大,不做调整
}
}
data[k] = temp;
}
}
先建立大根堆,原则是小元素不断下坠,然后把根节点和数组后面的数据进行交换