思想:
堆排序最主要在于构建堆这个数据结构上,构建好堆后,排序工作主要是插入,取出等操作。堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。
构建堆的两个最主要操作是 shiftUp() 、 shiftDown()。
public class MaxHeap {
private int[] data;
private int size;
public MaxHeap(int capacity) {
this.data = new int[capacity + 1];
this.size = 0;
}
private void shiftUp(int k) {
while (k / 2 >= 1 && data[k / 2] < data[k]) {
swap(data, k / 2, k);
k = k / 2;
}
}
private void shiftDown(int k){
while(k*2 < size){
int j = 2*k;
if(j+1 < size && data[j+1]>data[j]){
j ++;
}
if(data[j] < data[k] ){
break;
}
swap(data,k,j);
k = j;
}
}
public void insert(int e) {
data[size+1] = e; //加1
shiftUp(size);
size++;
}
public int extraMax(){
int ret = data[1];
swap(data,size,1);
size -- ;
shiftDown(1);
return ret;
}
private static void swap(int[] arr, int index1, int index2) {
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
public static void main(String[] args) {
int[] arr = {10, 2, 3, 4, 5, 9, 6, 8, 7};
MaxHeap maxHeap = new MaxHeap(arr.length);
for (int i : arr) {
maxHeap.insert(i);
}
for(int j = 0 ; j < arr.length ;j++){
System.out.println(maxHeap.extraMax());
}
}
}