13.2:堆排序
阿新 • • 發佈:2022-05-16
13.2:堆排序
理解了堆以及堆裡面的heapInsert() 和heapify(),堆排序就簡單了。
1、把陣列中的所有數都調成大根堆。heapSize = N。
2、0位置的數和N-1位置的數進行交換。heapSize = N - 1。N - 1位置和堆斷開,N-1位置輸出
3、從0位置到N-2位置進行heapify,調成大根堆。
4、0位置的數和N-2位置的數進行交換。heapSize --。N - 2位置和堆斷開,N-2位置輸出
5、。。。
6、直到heapSize == 0;
// 堆排序額外空間複雜度O(1)
public static void heapSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int i = 0; i < arr.length; i++) { // O(N)
heapInsert(arr, i);
}
int heapSize = arr.length;
swap(arr, 0, --heapSize);
// O(N*logN)
while (heapSize > 0) { // O(N)
heapify(arr, 0, heapSize); // O(logN)
swap(arr, 0, --heapSize); // O(1)
}
}