按算法导论写法,一个注意点:虽然随机化版本的快速排序的(数学)期望运行时间是O(n lgn),但在实际使用时要注意到,random函数本身开销也不小
题目
以剑指offer 40 最小的k个数为例
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
示例 1:
输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]
示例 2:
输入:arr = [0,1,2,1], k = 1
输出:[0]
限制:
0 <= k <= arr.length <= 10000
0 <= arr[i] <= 10000
代码
class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
quickSort(arr, 0, arr.length - 1, k);
return Arrays.copyOf(arr, k);
}
private void quickSort(int[] A, int p, int r, int K)
{
if (p < r)
{
int q = partition(A, p, r);
int len = q - p + 1;
if (K < len)
quickSort(A, p, q - 1, K);
else if (K > len)
quickSort(A, q + 1, r, K - len);
}
}
private int partition(int[] A, int p, int r)
{
Random random = new Random();
int pivotIndex = random.nextInt(r - p + 1) + p;
int pivot = A[pivotIndex];
swap(A, r, pivotIndex);
int i = p - 1;
for (int j = p; j < r; j++)
{
if (A[j] < pivot)
{
i++;
swap(A, i, j);
}
}
swap(A, i + 1, r);
return i + 1;
}
private void swap(int[] A, int a, int b)
{
int temp = A[a];
A[a] = A[b];
A[b] = temp;
}
}