问题描述

分析
这题可以先把输入的数组排序称为升序的状态,然后返回数组里面的前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:复制的长度
这个方法就是将指定长度的源数组里面的元素复制到目标数组,明白上面参数的含义就知道该怎么使用这个方法了
本文介绍了如何使用快速排序算法对输入数组进行排序,并在排序后选取前k个最小元素。通过自定义快速排序函数,实现了数组的升序排列。此外,详细讲解了System.arraycopy方法的使用,用于高效地将排序后的前k个元素复制到新的数组中返回。这种方法在处理大量数据时具有较高的效率。
4301

被折叠的 条评论
为什么被折叠?



