提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、算法引入
- 1. 冒泡排序
- 2.快速排序
- 3. 快速选择
- (1)题目:数组中的第K个最大元素
- (2)代码
前言
本文由快速排序算法引入快速选择算法(顺便复健一下其他的排序算法以及java排序的api)
一、算法引入
由冒泡排序和快速排序引入快速选择算法
1. 冒泡排序
从左向右依次比较相邻元素,将较大值交换到右边
每一轮可以固定一个最大元素的位置
2.快速排序
先选择一个base元素(一般是左边第一个,即left指针一开始指向的那个元素),然后设置两个指针(left指向开头right指向结尾),
然后开始循环:
right和left分别从后向前和从前向后遍历,right从后向前找到小于base的元素,放在left处;left从前向后找到大于base的元素,放在right处,直到left和right指针相遇
这样一轮之后就可以固定住base的位置,然后就可以递归的将左区间和右区间按照这个方法排序
public static void quickSort(int nums[], int start, int end) {
//数组有多个元素进行排序
if (start < end) {
int base = nums[start];//以要进行排序数组第0个元素为base
int left = start;//左指针
int right = end;//右指针
while (left < right) {
//从右向左找,比base大,right--
while (left< right && nums[right] >= base) {
right--;
}
//比base小,替换left所在位置的数字
nums[left] = nums[right];
//从左向右找,比base小,left++
while (left < right && nums[left] <= base){
left++;
}
//比base大,替换right所在位置的数字
nums[right] = nums[left];
}
nums[left] = base;//此时left=right,用base替换这个位置的数字
//排列比base小的数字的数组
quickSort(nums, start, left - 1);
//排列比base大的数字的数组
quickSort(nums, left + 1, end);
}
}
3. 快速选择
快速选择算法是一种在未排序数组中查找第K大/小元素的算法,时间复杂度为O(n),空间复杂度为O(1),通过改进快速排序算法来解决这个问题,分解的过程中对子数组进行划分,只在base某一边的数组继续选择
(1)题目:数组中的第K个最大元素
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。
示例 1:
输入: [3,2,1,5,6,4], k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4
提示:
1 <= k <= nums.length <= 105
-104 <= nums[i] <= 104
(2)代码
class Solution {
public int findKthLargest(int[] nums, int k) {
int n = nums.length;
return quickSelect(nums, 0, n-1, n - k);
}
private int quickSelect(int[] nums, int left, int right, int k){
//左右指针相遇,区间内只有一个元素
if(left == right){
return nums[k];
}
//边界的虚拟位置
int base = nums[left], i = left - 1, j = right + 1;
//持续交换base左右两边的元素
while(i < j){
do i ++; while (nums[i] < base);
do j --; while (nums[j] > base);
//如果i比j小,进行交换
if(i < j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
//左半部分
if(k <= j){
return quickSelect(nums, left, j, k);
}else{
return quickSelect(nums, j + 1, right, k);
}
}
}