快速排序:
- 分:找到分成两部分进行排序的pos(使用partition)
- 治:分别对这两部分进行快速排序
重点:partition
找到pivot(两个方法:1. 取第一个值;2. 取随机值),并放在区间的最右边
设定pointer作为最终要返回的pos,实际代表的是pivot的位置,其左边元素均小于pivot,右边元素均大于pivot
于是对区间内元素进行遍历,如果小于pivot,将其放在pointer的位置,并将pointer+1
遍历结束后,将pivot放到pointer它应该在的位置
返回pointer(即pos)
class Solution {public int[] sortArray(int[] nums) {// 快速排序quickSort(nums, 0, nums.length - 1);return nums;}// 快速排序public void quickSort(int[] nums, int low, int high) {// while (low < high) {if (low < high) {int pos = partition(nums, low, high);quickSort(nums, low, pos - 1);quickSort(nums, pos + 1, high);}}public int partition(int[] nums, int l, int r) {int pivotIndex = l + new Random().nextInt(r - l + 1);swap(nums, pivotIndex, r);int pivot = nums[r];int pointer = l;for (int i = l; i < r; ++i) {// if (nums[i] < nums[pointer]) {if (nums[i] < pivot) {swap(nums, i, pointer);pointer++;}}swap(nums, pointer, r);return pointer;}public void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}}