題目:
設計一個算法,找出數組中最小的k個數。以任意順序返回這k個數均可。
示例:
輸入: arr = [1,3,5,7,2,4,6,8], k = 4 輸出: [1,2,3,4]
個人思路:
其實就是排序,本人用來系統給的排序函數、快速排序(Mysort1)、堆排序(Mysort2)三種方法
代碼:
class Solution {
public int[] smallestK(int[] arr, int k) {
// Arrays.sort(arr);
// Mysort1(arr,0,arr.length-1);
Mysort2(arr);
int[] re=new int[k];
for(int i=0;i<k;i++){
re[i]=arr[i];
}
return re;
}
public void Mysort2(int[] arr){
if(arr.length==0){
return;
}
int size=arr.length-1;
for(int i=0;i<arr.length;i++){
insert(arr,i);
}
swap(arr,0,size--);
while(size>0){
heapfiy(arr,0,size);
swap(arr,0,size--);
}
}
public void insert(int[] arr,int index){
while(arr[index]>arr[(index-1)/2]){
swap(arr,index,(index-1)/2);
index=(index-1)/2;
}
}
public void heapfiy(int[] arr,int index,int size){
int left=index*2+1;
while(left<=size){
int lagest=left+1<=size&&arr[left+1]>arr[left]?left+1:left;
lagest=arr[lagest]>arr[index]?lagest:index;
if(lagest==index){
break;
}
swap(arr,index,lagest);
index=lagest;
left=index*2+1;
}
}
// public void Mysort1(int[] arr,int start,int end){
// if(start<end){
// int less=start-1;
// int more=end;
// int index=start;
// while(index<more){
// if(arr[index]<arr[end]){
// swap(arr,++less,index++);
// }else if(arr[index]>arr[end]){
// swap(arr,--more,index);
// }else{
// index++;
// }
// }
// swap(arr,more,end);
// Mysort(arr,start,less);
// Mysort(arr,more+1,end);
// }
// }
public void swap(int[] arr,int l,int r){
int a=arr[l];
arr[l]=arr[r];
arr[r]=a;
}
}