带你了解堆排序

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

什么是归并排序?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值