上篇博客“排序算法(三) - 交换排序”介绍了交换排序,这篇博客咱们聊聊选择排序;
选择排序(Selection Sorting)的基本思想:每一次在 n - i + 1(i = 1,2,...,n - 1) 个记录中选取键值最小的记录作为有序序列的第 i 个记录。
看到上面这句话是不是有点懵啊?如果不是,你就比我厉害,因为刚开始的时候真心看不懂,后来动手排序一下也就明白了,其实很简单,就是一堆数字,挑最小的放到最前边,依次这样排就OK,实践一下比空想要好很多,当然,或许我理解的还不到位,如果读者您有不同见解咱一起交流。
01.直接选择排序
直接选择排序算法的基本思想:在第 i 次选择操作中,通过 N - i 次键值间比较,从 n - i + 1 个记录中选出键值最小的记录,并和第 i(1<= i <= n -1)个记录交换。
看图吧,直观一些。
图一:
这个直接选择排序算法主要部分包含两层嵌套的 for 循环,其时间复杂度为 O(N2)。
直接选择排序算法简单,容易实现,但不适宜于 n 较大的情况。另一方面它是不稳定的。
------------------------------------------------------------------------------------------------------
02.堆排序
关于这个堆排序,虽然过来做总结了,不过讲真,我到目前还有不清楚的地方,不过总结一次就会有一次的收获,这次就先把自己知道的,理解了的写出来。
上面咱们说的是直接选择排序,对直接选择排序分析可知,在 n 个键值中选出最小值,至少进行 n - 1 次比较。然而继续在剩余的 n - 1 个键值中选出次小值是否一定要进行 n - 2 次比较呢,如果利用第一次选择比较中的信息能否减少以后各次选择中的比较次数呢,这里就引出了推排序。
还有,堆排序分为最大堆跟最小堆,是以二叉树形式来表示的;
最大堆的各个节点,从根节点开始,数值从大到小依次排序。最小堆则相反。
接下来整张图片吧。
图二:
分析完后,堆排序在待排序记录较少时不适用,但对记录数很多时是很有效的,因为其主要运行时间耗费在建初始堆和不断“筛选”的过程。
对于 n 个记录进行排序所需的平均时间是 O(nlog2n)。在最坏情况下,其时间复杂度也为 O(nlog2n)
相对于快速排序来说,这是堆排序的最大优点。另外,堆排序是不稳定的。
行啦,选择排序就先到这里吧,告一段落,如果读者您有其他的建议或者想法非常欢迎一起交流。