这道题,有很多办法,冒泡排序的前k趟,但是这样的时间复杂度比较大,还有基于快排,基于堆排序的
基于快排的。其实Java中的Arrays.sort() 是基于的双轴快排,可以直接用。
代码如下:
package book;
public class NFindKTry1
{
public static int position(int arr[],int left,int right){
int temp=arr[left];
while(left<right){
while(arr[right]>=temp && right>left){
right--;
}
arr[left]=arr[right];
while(arr[left]<=temp && right>left){
left++;
}
arr[right]=arr[left];
}
arr[left]=temp;
return left;
}
public static void findK(int[] arr,int k,int left,int right){
int p=position(arr,left,right);
if(p==k-1){
System.out.println(arr[p]);
}else{
if(p<k-1){
findK(arr,k,p+1,right);
}else{
findK(arr,k,left,p-1);
}
}
}
public static void main(String[] args)
{
int[] arr={3,2,1,4,5,6,7};
findK(arr,5,0,arr.length-1);
}
}
哈哈
还有一种是基于堆排序的,小根堆PriorityQueue。
package book;
import java.util.PriorityQueue;
import java.util.Queue;
public class NFindKTRy2
{
public void baseHeap(int[] arr,int k){
Queue<Integer> heap=new PriorityQueue<Integer>();
for(int i=0;i<k;i++){
heap.add(arr[i]);
}
for(int t:arr){
if(t>heap.peek()){
heap.poll();
heap.add(t);
}
}
for(int t:heap){
System.out.println(t);
}
}
}
哈哈