修改快速排序算法以解决选择问题,步骤如下:
(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));
}
}