问题描述: 在n个无序的数中,找到最大值或最小值
解题思路: 选择第一个数与剩下的其他n-1个数进行比较,这样经过n-1比较后得到结果。时间复杂度O(n)
问题描述: 在n个无序的数中,同时找到最大值和最小值
解题思路: 两个数为一组将数据分成若干组,首先组内比较一次,然后,最大值与组内最大值比较一次,最小值与组内最小值比较一次。这样每两个数经过3次比较就能得到最大值与最小值。最终比较次数3(n-2)/2。若n为偶数,第一个数即作为最大值也作为最小值,若n为奇数,前两个数比较得到最大值与最小值,除去第一个数之后进行分组比较。时间复杂度为O(n)
问题描述:在n个无序的数中,找到第k个最大或最小的数。
解题思路: 首先进行排序,然后第k个数就是要找的答案。无论使用哪种基于比较的排序算法,最好的时间复杂度也要O(nlgn)。有没有更好的解决方法呢?
从快速排序中受到启发,每次在数组中寻找支点p时,寻找的支点就是第p个最大或最小的数。我们使用如下算法,就能以接近O(n)的时间复杂度找到答案: