13.2:堆排序 复杂度O(N * logN)
13.2:堆排序
基于比较的排序时间复杂度O(N * logN)是最好的了
理解了堆以及堆里面的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)
}
}

浙公网安备 33010602011771号