一、排序过程

二、代码实现
java
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void HeapSort(int[] arr) {
createHeap(arr);
int end = arr.length - 1;
while(end > 0) {
swap(arr,0,end);//把堆顶与最后一个数进行交换,此时end为最大的数
siftDown(arr,0,end);//再次进行向下调整,但不包括end
end--;
}
}
private static void createHeap(int[] arr) {
//从后往前建堆,保证每个树都是大根堆
for(int parent = arr.length/2 - 1; parent >= 0; parent--) {
siftDown(arr,parent,arr.length);
}
}
private static void siftDown(int[] arr, int parent, int length) {
int child = parent * 2 + 1;
while(child < length) {
//判断左右子树的大小,若右子树大于左子树,更新child,保证child是最大的孩子
if(child + 1 < length && arr[child] < arr[child+1]) {
child++;
}
//与父亲进行比较,若父亲大于孩子,直接跳出循环,否则进行交换
if(arr[parent] >= arr[child]) {
break;
}else{
swap(arr,parent,child);
parent = child;
child = parent * 2 + 1;
}
}
}
三、特性
-
堆排序使用堆来选数,效率就高了很多。
-
时间复杂度:O(N*logN)
-
空间复杂度:O(1)
-
稳定性:不稳定