昨天我们介绍了快速排序中的数组划分算法。我们发现选定主元后,可以将数组分为不大于主元、大于主元和主元三部分,而这似乎也能利用来找到数组中的第顺序统计量。所以将这种数组划分的思想应用到选择问题当中,可以得到一种时间复杂度较小的选择算法。
我们假设已经将数组进行了第一次的划分,已经分成了三部分且主元已经放到了正确的位置,即主元左边的数全部小于等于主元,右边的数全部大于主元,设主元的下标为,那么此时主元就是第顺序统计量。这里就体现出来快速排序与选择问题的不同,在选择问题中我们不需要将两侧都进行处理,而只需处理一侧。如果我们要求的第顺序统计量的与主元的下标加1即相同,那么主元就是我们要求的;如果小于,就意味着我们要求的在主元左侧的数组中,接下来对左侧的数组再次进行划分即可;如果大于则在右侧处理右侧数组即可。这里介绍的是一种思想,具体问题会涉及到边界问题,在编写代码时需要注意防止出现数组越界等错误。
再进一步我们根据快速排序有关的知识就会发现,在最坏情况下快速排序的时间复杂度为,而我们所用的选择算法最坏情况下也会达到,原因同样是由于主元的选择问题,即我们每次都选择到了当前数组的最大值作为主元。但我们可以发现,快速排序算法的时间复杂度是的,而我们的选择算法是一定要比快速排序所需时间要少的,因此可以认为该算法的平均时间复杂度是不大于的。在查阅资料之后发现,可以严格证明这种算法的期望时间复杂度为。这里的证明过程较为复杂,我们预备在以后继续进行研究。
这样我们就解决了选择问题,这也是数据结构中很重要的一种算法。在学习的过程中我们发现,我们所学的知识会在某一方面给我们很大的提示,即便我们在学习的时候并没有特别注意过。方法是多种多样的,思想却是相通的。希望我们今后能在学习数据结构等计算机专业课程的道路上越走越远。