算法思想
- 选择基准元素: 选择最左边的数为基准元素(pivot)。
- 分割区间: 设定两个指针 left 和 right,分别指向区间的左右两端,接下来让指针都向中间移动,将当前序列进行分割, 左侧的元素均小于等于基准元素, 右侧的元素均大于等于基准元素。同时,查找的过程中也可以判断当某个指针所指元素已经是在基准元素的一侧时,就不必再进行比较了。
- 递归排序: 排序两个分割后的子序列,不断递归,直到从左到右进行一趟扫描已经排好序。
Java实现
public class QuickSort {
public void sort(int[] nums) {
quickSort(nums, 0, nums.length - 1);
}
public void quickSort(int[] nums, int left, int right) {
if (left > right) return;
int l = left, r = right;
int pivot = nums[left];
int temp;
while (l < r) {
while (l < r && nums[r] >= pivot) r--;
while (l < r && nums[l] <= pivot) l++;
if (l < r) {
temp = nums[l];
nums[l] = nums[r];
nums[r] = temp;
}
}
nums[left] = nums[l];
nums[l] = pivot;
quickSort(nums, left, l - 1);
quickSort(nums, l + 1, right);
}
}
时间复杂度
快速排序的时间复杂度为 O(n log n)(基本情况下),在最坏情况下,快排时间复杂度为 O(n^2)