- 堆排序简介
- 实现(java)
- 复杂度和稳定性
1.堆排序简介
选择排序, 构造大顶堆, 选出对顶元素, 交换数组末尾元素和堆顶元素, 剩余元素再构造大顶堆
2.实现(java)
public class HeapSort {
public static void main(String[] args) {
int[] arr = {40, 35, 5, 63, 21, 82, 96, 77, 52, 19};
System.out.println("原数组: " + Arrays.toString(arr));
sortArr(arr);
System.out.println("排序后: " + Arrays.toString(arr));
}
public static void sortArr(int[] arr) {
for(int i = arr.length / 2 - 1; i >= 0; i--) {
adjustHeap(arr, i, arr.length);
}
for(int j = arr.length - 1; j > 0; j--) {
int tmp = arr[j];
arr[j] = arr[0];
arr[0] = tmp;
adjustHeap(arr, 0, j);
}
}
public static void adjustHeap(int[] arr, int i, int n) {
int tmp = arr[i];
for(int child = 2 * i + 1; child < n; child = 2 * child + 1) {
if(child + 1 < n && arr[child] < arr[child + 1]) {
child++;
}
if(arr[child] > tmp) {
arr[i] = arr[child];
i = child;
}else {
break;
}
}
arr[i] = tmp;
}
}
3.复杂度和稳定性
排序算法 | 最好时间复杂度 | 最坏时间复杂度 | 平均时间复杂度 | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
堆排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(1) | 不稳定 |
重新构建堆的时间复杂度为O(nlog2n)
交换元素时需要一个临时变量, 故空间复杂度为O(1)