关键:分治思想
    函数 partition 难理解一些,多看下就好了

    1. const swap = (arr, i, j) => {
    2. if (i === j) return;
    3. const temp = arr[i]
    4. arr[i] = arr[j]
    5. arr[j] = temp
    6. }
    7. // 获取 pivot 交换完后的 index
    8. // 关键函数 以 pivot 为锚点 左右分开。
    9. const partition = (arr, pivot, left, right) => {
    10. const pivotVal = arr[pivot]
    11. let startIndex = left
    12. for (let i = left; i < right; i++) {
    13. if (arr[i] < pivotVal) {
    14. swap(arr, i, startIndex)
    15. startIndex++
    16. }
    17. }
    18. swap(arr, startIndex, pivot)
    19. return startIndex
    20. }
    21. const quickSort = (arr, left, right) => {
    22. if (left < right) {
    23. // 取 最右侧 的元素作为 pivot
    24. let pivot = right
    25. let partitionIndex = partition(arr, pivot, left, right)
    26. console.log('incccc', arr)
    27. quickSort(arr, left, partitionIndex - 1 < left ? left : partitionIndex - 1)
    28. quickSort(arr, partitionIndex + 1 > right ? right : partitionIndex + 1, right)
    29. }
    30. }
    31. const testArr = []
    32. let i = 0
    33. while (i < 10) {
    34. testArr.push(Math.floor(Math.random() * 1000))
    35. i++
    36. }
    37. console.log('unsort', testArr)
    38. quickSort(testArr, 0, testArr.length - 1);
    39. // unsort (10) [969, 549, 624, 140, 753, 281, 442, 884, 35, 681]
    40. // incccc (10) [549, 624, 140, 281, 442, 35, 681, 884, 969, 753]
    41. // incccc (10) [35, 624, 140, 281, 442, 549, 681, 884, 969, 753]
    42. // incccc (10) [35, 140, 281, 442, 549, 624, 681, 884, 969, 753]
    43. // incccc (10) [35, 140, 281, 442, 549, 624, 681, 884, 969, 753]
    44. // incccc (10) [35, 140, 281, 442, 549, 624, 681, 884, 969, 753]
    45. // incccc (10) [35, 140, 281, 442, 549, 624, 681, 753, 969, 884]
    46. // incccc (10) [35, 140, 281, 442, 549, 624, 681, 753, 884, 969]