快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:

    • 从数列中挑出一个元素,称为 “基准”(pivot);
    • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
    • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

    https://leetcode-cn.com/submissions/detail/117244196/

    1. function quickSort(arr: number[]) {
    2. quick(arr, 0, arr.length - 1)
    3. }
    4. function quick(arr: number[], left: number, right: number) {
    5. const index = partition(arr, left, right)
    6. if(index - 1 > left) {
    7. quick(arr, left, index - 1)
    8. }
    9. if(index < right) {
    10. quick(arr, index, right)
    11. }
    12. }
    13. // 以一个数为基准 将大于基数的元素移到右边 小于基数的元素移到左边
    14. function partition(arr: number[], left: number, right: number): number {
    15. // 取随机值为基准
    16. const random = arr[Math.floor(Math.random() * (right - left + 1)) + left]
    17. let i = left, j = right
    18. while(i <= j) {
    19. // 左边大于基准的值
    20. while(arr[i] < random) {
    21. i++
    22. }
    23. // 右边小于基准的值
    24. while(arr[j] > random) {
    25. j--
    26. }
    27. // 交换
    28. if(i <= j) {
    29. swap(arr, i, j)
    30. i += 1
    31. j -= 1
    32. }
    33. }
    34. return i
    35. }
    36. // 交换数组元素
    37. function swap(arr: number[], i: number, j: number) {
    38. let temp = arr[i]
    39. arr[i] = arr[j]
    40. arr[j] = temp
    41. }