js排序之快速排序
快速排序的3个基本步骤:
- 从数组中选择一个元素作为基准点
- 排序数组,所有比基准值小的元素摆放在左边,而大于基准值的摆放在右边。每次分割结束以后基准值会插入到中间去。
- 最后利用递归,将摆放在左边的数组和右边的数组在进行一次上述的1和2操作。
快速排序实现方式一(简明易懂,好理解,好写,适合面试时候写)
var quickSort = function(arr) { if (arr.length <= 1) { return arr; } var pivotIndex = Math.floor(arr.length / 2); var pivot = arr.splice(pivotIndex, 1)[0]; var left = []; var right = []; for (var i = 0; i < arr.length; i++) { if (arr[i] < pivot) { left.push(arr[i]); } else { right.push(arr[i]); } } return quickSort(left).concat([pivot], quickSort(right)); };
快速排序的实现方式二(正规写法)
function swap(A, i, j) { const t = A[i]; A[i] = A[j]; A[j] = t; } /** * * @param {*} A 数组 * @param {*} p 起始下标 * @param {*} r 结束下标 + 1 */ function divide(A, p, r) { const x = A[r - 1]; let i = p - 1; for (let j = p; j < r - 1; j++) { if (A[j] <= x) { i++; swap(A, i, j); } } swap(A, i + 1, r - 1); return i + 1; } /** * * @param {*} A 数组 * @param {*} p 起始下标 * @param {*} r 结束下标 + 1 */ function qsort(A, p = 0, r) { r = r || A.length; if (p < r - 1) { const q = divide(A, p, r); qsort(A, p, q); qsort(A, q + 1, r); } return A; }
青云直上三千码