快速选择算法 查找数组中第个最小元素(元素不重复)

修改快速排序算法以解决选择问题,步骤如下:

(1)若数组S中只有一个元素,则返回次元素。

(2)在S中选取元素v作为枢纽.

(3)将集合S-{v} 分割成两个集合S1和S2。

(4)若k<=|S1|,则第K个元素在集合S1中,对S1进行迭代,即quickSelect(S1,k ) .   若k=|S1|+1,则枢纽元为要找的元素。否则第k个元素在S2中,它是S2中第K-|S1|-1个最小元,即quickSelect(S2,K-|S1|-1)。

代码如下:

 

public class Ktop {
	
	public static void swap(int[] a,int i,int j){
		int temp  = a[i];
		a[i]= a[j];
		a[j] = temp;	
	}
	
	public static int selectPivot(int[] a ,int left,int right){
		int center = (left+right)/2;
		if(a[left]>a[center]){
			swap(a,left,center);
		}
		if(a[left]>a[right]){
			swap(a,left,right);
		}
		if(a[center]>a[right]){
			swap(a,center,right);
		}		
		//swap(a,center,right-1);
		System.out.println("枢纽元:"+a[center]);
		return center;
	}
	public static int quickSort(int[] a,int left,int right,int k){
		
		if(left <right){
			int center = selectPivot(a,left,right);//right-1位置上的元素为枢纽元
			int pivot = a[center];
			int i = left , j=right;
			swap(a,center,right);
			while(i<j){
				
				while(i<j && a[i]<pivot){
					i++;
					
				}
				if(i<j){
				a[j]= a[i];
				j--;}
				while(i<j && a[j]>pivot){
					j--;
				}
				if(i<j){
					a[i]= a[j];
					i++;	
				}
				
			}
			
			a[i] =pivot;
			
			
			if(k==(i-left+1)){
				
				return a[i];
				
			}
			else if(k<i-left+1){
				return quickSort(a,left,i-1,k);	
			}
			else
			{
				return quickSort(a,i+1,right,k-i-1);
			}
			
		}
		
	return a[left];
		
	}

	public static void main(String[] args) {
		int[] a = new int[]{1,5,2,19,67,34,76,3,6,23,32,7,6,4,10,6,99};
		System.out.println(quickSort(a,0,a.length-1,10));
		for(int i :a){
			System.out.print(i+" ");
		}
		//System.out.println(quickSort(a,0,a.length-1,3));

	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值