快速排序的核心思想是“分治法”。即,将一个大问题分解成若干个相似的小问题,解决了这些小问题,也就解决了那个大问题。
快速排序的大致过程就是:
- 将数组分成左右两个部分,先将左右两端和中间这三个数进行排序,再分别对左右两个部分子数组进行排序;
- 对子数组的排序也是分成左右两个部分进行排序;
- 如果子数组元素只有2个,则直接进行比较,排序
- 也可以将此阀值设置为3,即当子数组元素只有3个时直接进行比较排序
quick_sort(arr) { // 快速排序入口方法 _sort(arr, 0, arr.size-1) } _sort(arr, low, high) { if (low <= high) { // 元素索引已超出正常范围,无需排序 return } if (low == high-1) { // 达到直接排序的阀值——只有2个元素 swap_if_need(arr, low, high) return } // 划分左右子数组 mid = low + (high-low)/2 // 对三个端点元素排序 sort_sentry(arr, low, mid, high) // 对左边子数组排序 _sort(low, mid) // 对右边子数组排序 _sort(mid+1, high) } sort_sentry(arr, low, mid, high) { swap_if_need(arr, low, mid) swap_if_need(arr, low, high) swap_if_need(arr, mid, high) } swap_if_need(arr, low, high) { if (arr[low] > arr[high]) { // 从小到大的顺序 tmp = arr[low] arr[low] = arr[high] arr[high] = tmp } }