1.冒泡排序
2.选择排序
3.插入排序
4.
5.快速排序
快速排序:递归+分治
思想:选一个标兵,每次遍历,让标兵左边的元素都小于标兵,右边的元素都大于标兵;停止移动的条件是:left > right
重点:
1.标兵的选择:可以以左边第一个为标兵;(也可以随机,但是还不清楚为什么可以随机,随机不会遗漏吗?)
2.停止的边界:当某个元素符合他当前所在位置,那忽略,指针继续往前移动
2.移动的顺序:如果选择左边第一个为标兵,那从右边开始遍历;
3.交换的条件:1) 当右边的元素比标兵小 2)当左边的元素比标兵大时,并且 left < right,将左右进行交换
4.收尾:当左右指针相碰时,将当前元素跟标兵位置互换。
代码如下,还有待优化。
class Solution {
public int findKthLargest(int[] nums, int k) {
quickSort(nums, 0, nums.length - 1);
//System.out.println(Arrays.toString(nums));
return nums[nums.length - k];
}
public void quickSort(int[] nums, int left, int right) {
if (left > right) {
return;
}
int pivot = nums[left];
int i = left;
int j = right;
while (i < j) {
while (j > i && nums[j] >= pivot) {
j--;
}
while (i < j && nums[i] <= pivot) {
i++;
}
if (i < j) {
swap(nums, i, j);
}
}
swap(nums, left, i);
quickSort(nums, left, j - 1);
quickSort(nums, j + 1, right);
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}