过程
我们从数组中选择一个元素,我们把这个元素称之为中轴元素吧,然后把数组中所有小于中轴元素的元素放在其左边,所有大于或等于中轴元素的元素放在其右边,显然,此时中轴元素所处的位置的是有序的。也就是说,我们无需再移动中轴元素的位置。
从中轴元素那里开始把大的数组切割成两个小的数组(两个数组都不包含中轴元素),接着我们通过递归的方式,让中轴元素左边的数组和右边的数组也重复同样的操作,直到数组的大小为1,此时每个元素都处于有序的位置。
动图展示
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
public class QuickSort {
public static void quickSort(int[] arr, int left, int right) { if (left < right) { int pivot = arr[left]; int i = left + 1; int j = right; while (true) { while (i <= j && arr[j] >= pivot) j--; while (i <= j && arr[i] <= pivot) i++; if (i >= j) { break; } int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } arr[left] = arr[j]; arr[j] = pivot; quickSort(arr, left, j - 1); quickSort(arr, j + 1, right); } }
public static void main(String[] args) { int[] arr = {2, 5, 3, 1, 4, 6}; quickSort(arr, 0, arr.length - 1); System.out.println(Arrays.toString(arr)); }
}
|
性质:
- 时间复杂度:O(nlogn)
- 空间复杂度:O(logn)
- 非稳定排序
- 原地排序
参考