一、概述
1. 快速选择算法,在一个无序的数组中寻找第K小的数.
2. 随机选取中位数的算法实现:Randomized-Select
3. 平均时间复杂度:O(n)
4. 最快时间复杂读:O(n2) --> n方
1. 快速选择算法,在一个无序的数组中寻找第K小的数.
2. 随机选取中位数的算法实现:Randomized-Select
3. 平均时间复杂度:O(n)
4. 最快时间复杂读:O(n2) --> n方
二、代码实现:
public class RandomizedSelect {
public static void main(String[] args) {
int[] arr = {1000, 0, 6, 5, 4, 3, 2, 1, 7, 156, 44, 23, 123, 11, 5 };
int kth= quickSelect(arr,0,arr.length-1,3); //这里求第3小的数
System.out.println("quickSelect:" + kth);
Arrays.sort(arr);
System.out.println("排序后:"+Arrays.toString(arr));
}
public static int quickSelect(int[] arr, int l, int h, int k){
int l_temp = l; //缓存
int h_temp = h;
int q = randomizedPartition(arr,l,h);//随机择取中位数
//快速选择的核心逻辑
if(q==k-1)
return arr[q];
else if(q < k-1)
return quickSelect(arr,q+1,h_temp,k);
else
return quickSelect(arr,l_temp,q-1,k);
}
public static int randomizedPartition(int[] arr, int l, int h){
int i = new Random().nextInt(h-l+1)+l;
//由于partition中默认选取的是最后一位为主元,要随机选取,需要把随机取到的数放到最后
swap(arr,i,h);
return partition(arr,l,h);
}
public static int partition(int[] arr, int l, int h){
int i = l-1;
int key = arr[h];//选取最后一位为中位数或者叫主元
for(int j = l; j <h; j++){
if(arr[j] <= key){
i++;
swap(arr,i,j);
}
}
swap(arr,i+1,h);
return i+1;
}
public static void swap(int[] arr, int i, int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
/*
结果:
quickSelect: 2
排序后:[0,1,2,3,4,5,5,6,7,11,23,44,123,156,1000]
*/