Java算法——最小的k个数(剑指Offer第40道题)

本文介绍了如何使用快速排序算法对输入数组进行排序,并在排序后选取前k个最小元素。通过自定义快速排序函数,实现了数组的升序排列。此外,详细讲解了System.arraycopy方法的使用,用于高效地将排序后的前k个元素复制到新的数组中返回。这种方法在处理大量数据时具有较高的效率。

问题描述

分析

这题可以先把输入的数组排序称为升序的状态,然后返回数组里面的前k项即可

可以直接用Arrays.sort对数组进行排序,但是这样会不会太简单了哈哈哈

所以咱们手写快速排序进行排序

代码实现

    /*
    先利用快速排序将输入的数组排成有序数组
    然后再前k个元素复制给result数组返回
     */
    public static int[] getLeastNumbers(int[] arr, int k) {
        int[] sort = quickSort(arr, 0, arr.length - 1);
        int[] result = new int[k];
        System.arraycopy(sort, 0, result, 0, k);
        return result;
    }

    public static int onceQuickSort(int[] nums,int low,int high) {
        int temp = nums[low];
        while (low < high) {
            //如果高位指针指向的元素比temp大或者相等则将指针往前移动
            while (high > low && nums[high] >= temp)
                high--;
            //如果高位指针指向的元素小于temp则将高位指针指向的元素赋值给低位指针的元素
            nums[low] = nums[high];
            //如果底位指针指向的元素比temp小或者相等则将指针往后移动
            while (low < high && nums[low] <= temp)
                low++;
            //如果底位指针指向的元素大于temp则将底位指针指向的元素赋值给高位指针的元素
            nums[high] = nums[low];
        }
        //最终low指针与high指针会相遇,此时将temp放到这个位置
        nums[low] = temp;
        return low; //将已经归位元素的数组下标返回
    }

    public static int[] quickSort(int[] nums,int low,int high) {
        if (low < high) {
            int homing = onceQuickSort(nums,low,high);
            //对已归位元素的右边无序区递归进行快排,此时右边无序区的low指针为已归位元素下标加一
            quickSort(nums,homing + 1,high);
            //对已归位元素左边无序区递归进行快排,此时左边无序区的high指针为已归位元素下标减一
            quickSort(nums,low,homing - 1);
        }
        return nums;
    }

在此特别提一下System.arraycopy 的用法,先看看该方法源码的定义

 解释一下各参数的意思

  • src:源数组
  • srcPos:源数组要复制的起始位置
  • dest:目标数组
  • destPos:目标数组放置的起始位置
  • length:复制的长度

这个方法就是将指定长度的源数组里面的元素复制到目标数组,明白上面参数的含义就知道该怎么使用这个方法了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值