线性时间选择算法
1.选择算法的分解
线性时间选择算法利用快速排序的思想,将列表很据要求划分为俩部分,但是只会计算其中满足需求的一个部分。通过递归的思想,逐渐查询到需要的值。
2.选择算法的解决
在递归方法中,设置递归出口,当A[l,r]中,l == r时返回A[l],通过快排求出基准线piort,计算k = piort - l +1。然后比较i和k的大小,如果相等返回A[piort],否则根据要求继续对一边进行快速排序。
3.代码
public static int randomizedSelect(int[] arr,int left,int right,int i){ if(left == right){ return arr[left]; } int p = partition(arr,left,right); int k = p - left + 1; if(k == i){ return arr[p]; }else if(k < i){ return randomizedSelect(arr,p+1,right,i-k); }else{ return randomizedSelect(arr,left,p-1,i); } } public static int partition(int[] arr,int left,int right){ int pivot = arr[right]; int i = left -1; for(int j = left; j <= right-1;j++){ if(arr[j]<= pivot){ i = i+1; int t1 = arr[i]; arr[i] = arr[j]; arr[j] = t1; } } int t2 = arr[i+1]; arr[i+1] = arr[right]; arr[right] = t2; return i+1; }
4.性能表现
最好和最坏时间复杂度都是O(n),空间复杂度为O(n)。
浙公网安备 33010602011771号