数组第k小的元素 要求复杂度在O(n) kua方法: 使用分治策略,类似与快速排序的方法,先对数组分组,然后判断第k小的元素应该在哪个分组 然后递归该分组,最后求的第k小的元素 /* 使用分段的思想求第k小的数(减治法) 如:第1小的数是最小的数 思想:对于一个数组a[0...n-1],分段成a[0...s-1],a[s],a[s+1...n-1] 分组后,a[0...s-1]里面的元素都小于等于a[s]; a[s+1...n-1]里面的元素都大于等于a[s]; 所以,如果 s==k-1,那么a[s]就是要求的数; 如果 s>k-1,那么要求的数在a[0...s-1]里; 如果 s<k-1,那么要求的数在a[s+1...n-1]里; 因此,我们把范围缩小到 a[0...s-1]或者a[s+1...n-1]里; 对缩小后的数组也做同样的操作; 通常情况下,这个比快速排序要高效: 因为快速排序要同时处理被分割的2段, 而此方法只需要处理一段; */ 实现: //求数组中最小的第K的元素,要求时间复杂度O(n) //原理类似与quicksort,都是分治 //不同在与,minK只需要对其中一个分组进行递归 //该方法最坏复杂度为O(n^2),但是平均复杂度有O(n) //复杂度取决于基准值的选择,可以使用随机选择基准值 public static int minK(int[] array, int low, int high, int k) { if( low == high ) return array[low]; int pivotPos = partition(array, low, high); int j = pivotPos - low + 1; if( k == j ) return array[pivotPos]; if( k < j ) return minK(array, low, pivotPos - 1, k); else return minK(array, pivotPos + 1, high, k - j); }