原理简介
快速排序原理即是,选择数组中的一个元素作为基准值 pivot(通常使用第一个就行),然后遍历其他元素,将小于 pivot 的元素放置在左边,将大于 pivot 的元素放置在右边。如是你可以得到两个子数组,再依次对子数组进行快速排序,最终完成排序。
时间复杂度
快速排序比选择排序快得多,其时间复杂度为 O(n * lg n),是最快的排序算法之一。最糟糕的情况下,快速排序的时间复杂度为 O(n^2)。
代码实现
Java 的快速排序示例如下:
public class Main {
public static void main(String[] args) {
int[] arr = new int[] { 45, 80, 55, 40, 42, 85 };
quickSort(arr, 0, arr.length - 1);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
public static void quickSort(int[] arr, int start, int end) {
if (end <= start) {
return;
}
int low = start;
int high = end;
int pivot = arr[low];
while (low < high) {
while (low < high && arr[high] >= pivot) {
high--;
}
arr[low] = arr[high]; // 将小于 pivot 的数放在地位
while (low < high && arr[low] <= pivot) {
low++;
}
arr[high] = arr[low]; // 将大于 pivot 的数放在高位
}
arr[low] = pivot;
quickSort(arr, start, low - 1); // 递归排序左半部分
quickSort(arr, low + 1, end); // 递归排序右半部分
}
}
运行结果
40 42 45 55 80 85
分析
1、设置两个指针分别指向数列起始和结束位置,左指针代表小于基准元素的区域,反之右指针大于基准。
2、从右指针处开始元素遍历,如果遍历到大于基准元素的,继续向后遍历。如果小于基准元素的,将指针位置与基准交换。
第一次:从后往前 查找比45小的数 42比45小 他俩交换位置:42,80,55,40,45,85
第二次:从前往后 找比45大的数 80>45 交换位置:42,45,55,40,80,85
第三次:从后往前 找比45小的数 40<45 交换位置:42,40,55,45,80,85
第四次:从前往后 找比45大的数 55>45 交换位置:42,40,45,55,80,85
至此,第一趟排序结束,然后分别递归数组左右部分,即可完成快排(当数据基本有序时,不宜用快排)。