二叉堆:一组能够用堆有序的完全二叉树排序的元素,并在数组中按照层级存储。
特点:用数组实现,第一个位置不存储元素,父节点比两个子节点都要大或者小(最大堆或最小堆)。实现代码比较简单,直接记录了。
public class HeapSort {
public static void sort(int[] a) {
int len = a.length - 1;
//构造堆
for (int i = len / 2; i >= 1; i--) {
sink(a, i, len);
}
//对数组进行排序
while (len > 1) {
SortUtils.swap(a, 1, len--);
sink(a, 1, len);
}
}
private static void sink(int[] a, int i, int len) {
while (2 * i <= len) {
int j = 2 * i;
if (j < len && a[j] < a[j + 1]) j++;
if (a[i] >= a[j]) break;
SortUtils.swap(a, i, j);
i = j;
}
}
}
sink下沉法注意不要越界,堆排序最大比较次数2NlgN+2N,交换次数为比较的一半。
几大排序简单对比:
稳定排序有:冒泡,插入,归并。