在若干个数中求出k个最小的数,利用快速排序找基准值的原理定位k的位置所在
时间复杂度O(n)
public static void findK(int[]arr,int k,int first,int last)
{
int index=pivotIndex(arr,first,last);
if(index==k)
return;
else if(index<k)
{
findK(arr,k,index+1,last);
}
else
{
findK(arr,k,first,index);
}
}
public static int pivotIndex(int[]arr,int first,int last)
{
int mid,pivot,scanUp,scanDown;
mid=first+((last-first)>>1);
pivot=arr[mid];
arr[mid]=arr[first];
arr[first]=pivot;
scanUp=first+1;
scanDown=last-1;
for(;;)
{
while(scanUp<=scanDown&&pivot>arr[scanUp])
{
scanUp++;
}
while(arr[scanDown]>pivot)
{
scanDown--;
}
if(scanUp>=scanDown)
{
break;
}
int temp=arr[scanUp];
arr[scanUp]=arr[scanDown];
arr[scanDown]=temp;
printArray(arr);
scanDown--;
scanUp++;
}
arr[first]=arr[scanDown];
arr[scanDown]=pivot;
return scanDown;
}