无序数组中最小的k个数
对于一个无序数组,数组中元素为互不相同的整数,请返回其中最小的k个数。
给定一个整数数组A及它的大小n,同时给定k,请返回其中最小的k个数。
[1,2,4,3],4,2
返回:[1,2]
(1)利用堆,时间复杂度O(Nlogk)
public class Main {
public static void main(String[] args) {
Main test = new Main();
int[] a={3188,4522,2526,4085,1621,723,1073};
int[] b=new int[6];
b=test.findKthNumbers(a,7,6);
System.out.println(b[0]);
System.out.println(b[1]);
System.out.println(b[2]);
System.out.println(b[3]);
System.out.println(b[4]);
System.out.println(b[5]);
}
public int[] findKthNumbers(int[] A, int n, int k) {
if(A==null||n<=k||k<1){
return A;
}
int[] result=new int[k];
heapSort(A,result,k);
for(int i=k;i<n;i++){
if(A[i]<result[0]){
heapModify(result,A[i]);
}
}
return result;
}
public void heapSort(int[] arr,int[] result,int k){
result[0]=arr[0];
for(int i=0;i<k;i++){
result[i]=arr[i];
int index=i;
int parent=(i-1)/2;
while(parent>=0&&result[parent]<result[index]){
swap(result,parent,index);
index=parent;
parent=(parent-1)/2;
}
}
}
public void heapModify(int[] arr,int key){
arr[0]=key;
int k=arr.length;
int index=0;
int child=(index+1)*2-1;
if(child+1<k){
child=arr[child]>=arr[child+1]?child:child+1;
}
while(child<k&&arr[index]<arr[child]){
swap(arr,index,child);
index=child;
child=(child+1)*2-1;
if(child+1<k){
child=arr[child]>=arr[child+1]?child:child+1;
}
}
}
public void swap(int[] arr,int i,int j){
int temp;
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
(2) 利用快排 平均O(n) 最坏O(n^2)
public class Main {
public static void main(String[] args) {
Main test = new Main();
int[] a={3188,4522,2526,4085,1621,723,1073};
int[] b=new int[6];
b=test.findKthNu