遍历:算法复杂度O(n)。
对数组进行排序,直接索引到第n大的元素。算法复杂度O(nlogn)。
这里利用快速排序来解决此问题:O(n)
思路:首先找到一个元素,将它移到合适的位置,如果该元素为4,且要找第四名的元素是什么,此时就不需要考虑前面的元素了。
如果要找第6名的元素,此时就从4这个位置开始找第2名的元素,接着再进行分组,然后求出左边组中的第2名元素,依次类推。
= O(2n) = O(n)。
import java.util.*;
public class Selection {
// 对arr[l...r]部分进行partition操作
// 返回p, 使得arr[l...p-1] < arr[p] ; arr[p+1...r] > arr[p]
// partition 过程, 和快排的partition一样
// 思考: 双路快排和三路快排的思想能不能用在selection算法中? :)
private static int partition(Comparable[] arr, int l, int r){
// 随机在arr[l...r]的范围中, 选择一个数值作为标定点pivot
swap( arr, l , (int)(Math.random()*(r-l+1))+l );