算法2-快速选择(java实现)

2 篇文章 0 订阅
一、概述
    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]
	*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值