剑指Offer--分类类型:排序
牛客网第JZ29,JZ63题()
JZ29(快速排序)
给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组
输入:[4,5,1,6,2,7,3,8],4
输出:[1,2,3,4]
解题思路
代码:
基于递归,
class Solution {
//快速排序算法
public int[] getLeastNumbers(int[] arr, int k) {
quickSort(arr, 0, arr.length - 1);
return Arrays.copyOf(arr, k);
}
private void quickSort(int[] arr, int l, int r) {
// 子数组长度为 1 时终止递归,左边的坐标大于右边
if (l >= r) return;
// 哨兵划分操作(以 arr[l] 作为基准数)
int i = l, j = r;
while (i < j) {
while (i < j && arr[j] >= arr[l]) j--;
while (i < j && arr[i] <= arr[l]) i++;
swap(arr, i, j);
}
swap(arr, i, l);
// 递归左(右)子数组执行哨兵划分
quickSort(arr, l, i - 1);
quickSort(arr, i + 1, r);
}
//交换位置函数
private void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
//冒泡排序,外层循环k次,挑出k个
for(int i = 0; i < k; i++){
for(int j = 0; j < input.length - i - 1; j++){
if(input[j] < input[j+1]){
int temp = input[j];
input[j] = input[j + 1];
input[j + 1] = temp;
}
}
冒泡的另一种写法:
循环的另一种考虑