一文带你了解堆排序
Posted 软件工程师涨薪姿势
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文带你了解堆排序相关的知识,希望对你有一定的参考价值。
1.堆排序的定义
2.堆排序的代码实现
3.复杂度分析
4.使用场景
5.下期预告
1.堆排序的定义
堆排序在八大排序算法中属于选择排序,她利用的是堆这种数据结构来构建的排序算法,堆分为大顶堆、小顶堆,根节点的数值要么是最大的,要么是最小的,堆排序最主要的两个操作是建堆和调整堆两个操作。
2.堆排序的代码实现
public static void downAdjust(int[] array, int parentIndex, int length) {
// temp保存父节点值,用于最后的赋值
int temp = array[parentIndex];
int childIndex = 2 * parentIndex + 1;
while (childIndex < length) {
// 如果有右孩子,且右孩子大于左孩子的值,则定位到右孩子
if (childIndex + 1 < length && array[childIndex + 1] > array[childIndex]) {
childIndex++;
}
// 如果父节点小于任何一个孩子的值,直接跳出
if (temp >= array[childIndex])
break;
//无需真正交换,单向赋值即可
array[parentIndex] = array[childIndex];
parentIndex = childIndex;
childIndex = 2 * childIndex + 1;
}
array[parentIndex] = temp;
}
public static void heapSort(int[] array) {
// 1.把无序数组构建成二叉堆。
for (int i = (array.length-2)/
2; i >= 0; i--) {
downAdjust(array, i, array.length);
}
System.out.println(Arrays.toString(array));
// 2.循环删除堆顶元素,移到集合尾部,调节堆产生新的堆顶。
for (int i = array.length - 1; i > 0; i--) {
// 最后一个元素和第一元素进行交换
int temp = array[i];
array[i] = array[0];
array[0] = temp;
// 下沉调整最大堆
downAdjust(array, 0, i);
}
}
3.复杂度分析
堆排序的时间复杂度为O(NlogN)与快速排序一样,空间复杂度为O(1),构建堆的时间复杂度为O(NlogN),需要进行N/2次循环,每一次调用downAdjusut方法,调整堆和构建堆的时间复杂度是一样的,这两个方法存在于两个不同的循环中,因此是并列的关系,最后得到堆排序的时间复杂度。
4.使用场景
堆排序和快速排序一样都是属于不稳定排序,,但是不会出现想快速排序那样不稳定的情况,通常使用在相对有序的大数据量下。
5.下期预告
什么是归并排序?
以上是关于一文带你了解堆排序的主要内容,如果未能解决你的问题,请参考以下文章