题目
求打乱数组中位数
考察快速排序
215 数组中的第K个最大元素 考察快速排序
class Solution {
// 快速排序 巧妙解法
int res;
public int findKthLargest(int[] nums, int k) {
quickSort(nums,0,nums.length - 1,nums.length - k + 1);
return res;
}
//另一个种实现 记这个版本
private void quickSort(int[] arr, int l, int r, int k) {
// 子数组长度为 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);
}
//下面是i或j都可以
swap(arr, i, l);
// 递归左(右)子数组执行哨兵划分
if(i == k - 1){
res = arr[i];
return;
}else if(i > k - 1){
quickSort(arr, l, i - 1,k);
}else{
quickSort(arr, i + 1, r,k);
}
}
private void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
剑指 Offer 51. 数组中的逆序对 考察归并排序
class Solution {
int res = 0;
public int reversePairs(int[] nums) {
int[] temp = new int[nums.length];
sort(nums,0,nums.length-1,temp);
return res;
}
private void sort(int[] arr,int left,int right,int []temp){
if(left<right){
int mid = (left+right)/2;
sort(arr,left,mid,temp);//左边归并排序,使得左子序列有序
sort(arr,mid+1,right,temp);//右边归并排序,使得右子序列有序
merge(arr,left,mid,right,temp);//将两个有序子数组合并操作
}
}
private void merge(int[] arr,int left,int mid,int right,int[] temp){
int i = left;//左序列指针
int j = mid+1;//右序列指针
int t = 0;//临时数组指针
//此处注意是i<=mid 不是i <= left
while (i<=mid && j<=right){
if(arr[i]<=arr[j]){
temp[t++] = arr[i++];
}else {
temp[t++] = arr[j++];
//记住这行代码
res += mid - i + 1;
}
}
//此处注意是i<=mid 不是i <= left
while(i<=mid){//将左边剩余元素填充进temp中
temp[t++] = arr[i++];
}
while(j<=right){//将右序列剩余元素填充进temp中
temp[t++] = arr[j++];
}
t = 0;
//将temp中的元素全部拷贝到原数组中
while(left <= right){
arr[left++] = temp[t++];
}
}
}
剑指 Offer 40. 最小的k个数 考察快速排序
class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
//利用快速排序 轴值的特点
if (k >= arr.length) return arr;
return quickSort(arr, k, 0, arr.length - 1);
}
private int[] quickSort(int[] arr, int k, int l, int r) {
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);
if (i > k) return quickSort(arr, k, l, i - 1);
if (i < k) return quickSort(arr, k, i + 1, r);
//否则i == k, i为第k+1小的数 返回前面的树即可 不需要排完全部序
return Arrays.copyOf(arr, k);
}
private void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
总结
leetcode 巧妙考察排序算法的题目