一、文字解释快速排序
- 以数组中第一个数为基数base,然后设立两个哨兵 i 和 j 分别是数组第一个元素下标和最后一个元素下标。这里以升序为例。
- 让哨兵 j 先往左走,如果这个哨兵位置所在元素比基数大,那么哨兵 j 就继续向左走,直到遇到比基数小的数停下,或者哨兵 j 遇到哨兵 i 停下。
- 当哨兵 j 停下后哨兵 i 开始向右走。与哨兵 j 相反,哨兵 i 位置的元素比基数小,那么哨兵 i 继续向右走,直到遇到比基数大的数停下, 或者哨兵 i 与哨兵 j 相遇停下。
- 当哨兵 i 和哨兵 j 都停下之后,我们交换哨兵 i 和哨兵 j 位置的元素。
- 如果这时哨兵 i 和哨兵 j 不相等,重复 2,3,4,直到哨兵 i 和哨兵 j 相遇。
- 上面一个循环走完哨兵 i 左面的元素都比 base 小,哨兵 i 右面的元素都比 base 大。然后让哨兵 i 位置所在元素和 base 交换。
- 然后以哨兵 i 为截点,将数组分为两块,对左右两块数组分别进行 1 - 6 的操作,也就是递归。
二、快速排序动图
三、代码
public class QuickSort {
public static void main(String[] args) {
int arr[] = {1, 42, 62, 25, 12, 3, 7, 9};
quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr, int left, int right) {
if (left > right) {
return;
}
int i = left;
int j = right;
int base = arr[left];
while (i != j) {
while (i < j && base <= arr[j]) {
j--;
}
while (i < j && base >= arr[i]) {
i++;
}
if (i < j) {
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
arr[left] = arr[i];
arr[i] = base;
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
}
输出结果:
[1, 3, 7, 9, 12, 25, 42, 62]
四、时间复杂度
最优情况下时间复杂度是O(nlogn)
最差情况下时间复杂度是O(n^2)
平均时间复杂度是O(nlogn)