目录
前言
现在给你一个无序数组,尝试用一种时间复杂度和空间复杂度尽可能小的方法,对该数组进行升序排序。
这个问题应该说我们在学习c语言的时候就遇到过,我们很容易想到冒泡排序法。冒泡排序法的时间复杂度是O(n^2),效率相对来说比较低今天我们讲述的堆排序可以很好的解决这个问题,把时间复杂度降到O(N*logN).同时给大家分享一下堆排序的一个应用---Topk问题。
堆排序
思路
1.首先我们要将数组变成一个堆的数据结构这里我们可以让数组的元素从前到后依次进行向上调整或者让数组的元素从后向前依次进行向下调整,经过以上操作我们可以得到一个堆。
2.我们接下来不断让堆顶元素跟最后一个元素交换(让最值放到后面),数组元素个数减去一,接着对元素个数减一的数组再进行调整,让它仍然是一个堆。重复以上操作。
经过上述操作后我们就可以对数组进行排序。
向上调整生成堆
下面我们来分析一下向上调整为小堆的方法。
我们知道向上调整需要深度小于该数据深度的数据构成一个小堆,那我们在遍历数据的时候就要从前到后来遍历这样可以一直保持小堆的状态。