【快排题解】高效求乱序数组中第k小元素

思路同快排一样,先定主元,主元前的数字比主元小,后面的数字比主元大,
如下图所示,“3”是主元。且(主元的下标+1)就是数组中的第(主元的下标+1)元素。
在这里插入图片描述

伪代码

	selectK(A,p,r,k){
		q = partition(A,p,r);//主元下标
		qK = q - p + 1;      //主元是第几个元素
		if(qk == k) return A[q];
		else if ( qk > k) {
			selectK(A,p,q-1,k);
		} else {
			selectK(A, q+1, r, k-qK);
		}
	}

全部代码

static int selectK(int[] A, int p, int r, int k){
		int q = partition(A,p,r);//主元下标
		int qK = q - p + 1;  
		System.out.println("qK="+qK);//主元是第几个元素
		if(qK == k) return A[q];
		else if ( qK > k) {
			return selectK(A,p,q-1,k);
		} else {
			return selectK(A, q+1, r, k-qK);
		}
	}
	
	static int partition(int[] A, int p, int r){
		int paviot = A[p];
		int sp = p +1;
		int bigger = r;
		while(sp <= bigger){
			if(A[sp] <= paviot){
				sp++;
			} else {
				int temp = A[sp];
				A[sp] = A[bigger];
				A[bigger] = temp;
				bigger--;
			}
		}
		
		int temp = A[p];
		A[p] = A[bigger];
		A[bigger] = temp;
		
		return bigger;
		
	}
	
	
	public static void main(String[] args) {
		int[] arr = {5,9,1,7,8,9,4,2,3};
		int a = selectK(arr, 0, arr.length-1, 4);
		System.out.println(a);
	}
发布了81 篇原创文章 · 获赞 13 · 访问量 2387

猜你喜欢

转载自blog.csdn.net/alovelypeach/article/details/104179207
今日推荐