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

问题描述

Java算法——最小的k个数(剑指Offer第40道题)_第1张图片

分析

这题可以先把输入的数组排序称为升序的状态,然后返回数组里面的前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:复制的长度

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

你可能感兴趣的:(数据结构与算法,算法,数据结构)