牛客--剑指offer--最小的k个数

一、问题描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

二、解题思路

主要是考察排序,本题实现了常用的插入排序,堆排序,归并排序,其中堆排序(最小堆)应该是速度最快的。

三、代码

1.插入排序

import java.util.*;
public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> result=new ArrayList<Integer>();
        if(input==null || input.length==0 || k>input.length)
            return result;
        int j;
        for(int i=1;i<input.length;i++){
            int tmp=input[i];
            for(j=i;j>0 && tmp-input[j-1]<0;j--)
                input[j]=input[j-1];
            input[j]=tmp;
        }
        for(int i=0;i<k;i++)
            result.add(input[i]);
        return result;
    }
}

2.归并排序

import java.util.*;
public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> result=new ArrayList<Integer>();
        if(input==null || input.length==0 || k>input.length)
            return result;
        int[] tmp=new int[input.length];
        mergeSort(input,tmp,0,input.length-1);
        for(int i=0;i<k;i++)
            result.add(input[i]);
        return result;
    }
    private void mergeSort(int[] a,int[] tmp,int left,int right){
        if(left<right){
            int middle=left+(right-left)/2;
            mergeSort(a,tmp,left,middle);
            mergeSort(a,tmp,middle+1,right);
            merge(a,tmp,left,middle+1,right);
        }
    }
    private void merge(int[] a,int[] tmp,int leftpos,int rightpos,int rightend){
        int leftend=rightpos-1;
        int numelements=rightend-leftpos+1;
        int tmppos=leftpos;
        while(leftpos<=leftend && rightpos<=rightend){
            if(a[leftpos]<a[rightpos])
                tmp[tmppos++]=a[leftpos++];
            else
                tmp[tmppos++]=a[rightpos++];
        }
        while(leftpos<=leftend){
            tmp[tmppos++]=a[leftpos++];
        }
        while(rightpos<=rightend)
            tmp[tmppos++]=a[rightpos++];
        for(int i=0;i<numelements;i++,rightend--)
            a[rightend]=tmp[rightend];
    }
}
3.堆排序(最小堆)

import java.util.*;
public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> result=new ArrayList<Integer>();
        if(input==null || input.length==0 || k>input.length)
            return result;
        for(int i=input.length/2;i>=0;i--){
            percDown(input,i,input.length);
        }
        for(int i=input.length-1;i>=(input.length-k);i--){
            result.add(input[0]);
            swapReference(input,0,i);
            percDown(input,0,i);
        }
        return result;
    }
   private void  percDown(int[] input,int i,int n){
        int child=0;
       int tmp;
       for(tmp=input[i];leftChild(i)<n;i=child){
           child=leftChild(i);
           if(child!=n-1 && input[child]>input[child+1])
               child++;
           if(tmp>input[child])
               input[i]=input[child];
           else
               break;
           
       }
       input[i]=tmp;
    }
    private int leftChild(int n){
        return 2*n+1;
	}
    private void swapReference(int[] input,int i,int j){
        int tmp=input[i];
        input[i]=input[j];
        input[j]=tmp;
    }
}

使用快排的思想排序

import java.util.*;
public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> result = new ArrayList<Integer>();
        if(input == null || k > input.length)
            return result;
        quickSort(input,0,input.length-1);
        for(int i=0;i<k;i++){
            result.add(input[i]);
        }
        return result;
    }
    private void quickSort(int[] a,int left,int right){
        if(right-left>=2){
            int median = getMedian(a,left,right);
            int i = left; int j = right-1;
            for(;;){
                while(a[++i]<median){
                    
                }
                while(a[--j]>median){
                    
                }
                if(i<j){
                   swap(a,i,j); 
                }else{
                    break;
                }
                
            }
            quickSort(a,left,i-1);
            quickSort(a,j+1,right);
            
        }else if(left < right && a[left]>a[right]){
	            swap(a,left,right);
	        }
    }
    private void swap(int[] a,int i,int j){
        int tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
    }
    private int getMedian(int[] a,int i,int j){
        int tmp;
        int median = i + (j-i)/2;
        if(a[i]>a[j]){
            tmp = a[i];
            a[i] = a[j];
            a[j] = tmp;
        }
        if(a[i]>a[median]){
            tmp = a[i];
            a[i] = a[median];
            a[median] = tmp;
        }
        if(a[median]>a[j]){
            tmp = a[median];
            a[median] = a[j];
            a[j] = tmp;
        }
        tmp = a[j-1];
        a[j-1] = a[median];
        a[median] = tmp;
        return a[j-1];
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值