剑指Offer40 最小的k个数
Posted 小布丁value
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer40 最小的k个数相关的知识,希望对你有一定的参考价值。
代码思路:先排序,在输出
冒泡排序:
class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
//排序,趟数
for(int i=0;i<arr.length-1;i++){
//两数进行比较
for(int j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
int[] res= new int[k];
for(int i=0;i<res.length;i++){
res[i]=arr[i];
}
return res;
}
}
效率太低了哈
方法二:先选择排序再输出
class Solution {
public static int[] getLeastNumbers(int [] arr,int k){
QuickSort(arr);
int[] res=new int[k];
for(int i=0;i<res.length;i++){
res[i]=arr[i];
}
return res;
}
public static void QuickSort(int [] array){
if(array==null||array.length<0) return;
Quick(array,0,array.length-1);
}
public static void Quick(int [] array,int low,int high){
if(low==high){
return;
}
int mar= partition(array,low,high);
if(mar-1>low){
Quick(array,low,mar-1);
}
if (mar+1<high){
Quick(array,mar+1,high);
}
}
//一次快排的过程
public static int partition(int [] array,int low,int high){
int mar=array[low];
while(low<high){
//从后往前找比它小的
while (low<high && array[high]>=mar){
high--;
}
if(low==high){
break;
}
if(array[high]<mar){
array[low]=array[high];
}
//从前往后找比他大的
while(low<high&&array[low]<=mar){
low++;
}
if(low==high){
break;
}
if(array[low]>mar){
array[high]=array[low];
}
}
array[low]=mar;
return low;
}
}
以上是关于剑指Offer40 最小的k个数的主要内容,如果未能解决你的问题,请参考以下文章