一文带你了解堆排序

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.下期预告

什么是归并排序?

以上是关于一文带你了解堆排序的主要内容,如果未能解决你的问题,请参考以下文章

一文带你读懂排序算法:希尔排序算法

一文带你了解Java8之Stream

一文带你了解Java8之Stream

一文带你了解Java8之Stream

NLP一文了解词性标注CRF模型

一文带你了解单元测试和基准测试干货