一分钟算法——堆排序
Posted 无忧公主的数学时间
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一分钟算法——堆排序相关的知识,希望对你有一定的参考价值。
堆排序
上次讲到堆,那堆排序是否也类似呢?当然是啊,神通广大的堆不仅可以解决许多问题,还是排序算法中最好的算法哦。
如果有许多字母,要进行堆排序。首先,利用这些字母建堆(小根堆),正如上次所讲,这要 O(N*log N) 。(因为每个数插入后最多从底部“游”到顶端,也就是 log N 层)其次,我们可以直接取根——最小的字母,因为这是小根堆。然后,把根和末尾数交换,N -1以便排除末尾数,再把现在的根往下“沉”。这样就完成了把原来的根去除并仍旧保持堆的状态。接下来,我们还可以直接去根——第二小的字母。以此类推,每次去除根、取新根。最后,我们就排好序啦。
(下图是堆排序的过程,只会显示一遍,如需看第二次,要再次打开此链接)
来讲堆排序的总的时间复杂度,想必各位已经猜到了,是O(N*log N)。为什么呢?一次的去除根要O(log N),然后取新根就不说了。每一次都得这么做所以总共就是O(N*log N)。堆排序的优点有很多,和众多排序一样(归并排序除外),它无需新的存储空间。再者,堆排序在任何一个时刻停止下来,就会有已经排好序的一段了。同理,上次也讲过了,如果要在100万个数中找出前100大的,无需将所有数都排序,只要做100次去除根就行了。而且,我们只要存一个有100个数的堆即可。因为每读入一个,如果比堆中最小的数还小,直接省去(有至少100个数比它大,所以不可能是最终前100大的)。注意了,这里的堆要是小根堆,因为要比较读入的数和堆中最小的数,如果最小的数是根那就方便很多了。
堆排序虽然具有不稳定性,但它是基本排序中最优的排序。
没听懂?是没看上次的堆吧,那就快点点击下方蓝字查看吧!
以上是关于一分钟算法——堆排序的主要内容,如果未能解决你的问题,请参考以下文章