快速排序是最常用的排序方法。
    时间复杂度: O(nLog^n)
    快速排序也采用的分支的方法,但是没有像归并排序那样彻底分割
    步骤

    1. 从数组中间选择一项作为主元
    2. 创建两个指针,左边一个纸箱数组第一个项,右边指向最后一个项,移动左边指针直到找到一个比主元大的项,接着,移动右指针直到找一个一个比主元小的项,然后交换他们,重复此步骤。直到左指针超过了右指针。这个过程将使得比主元小的元素都在左边, 大的都在右边。这一步叫做划分操作
    3. 接着,算法对划分后的小数组重复 1 、2 步骤,直至数组完全排序

    JavaScript

    1. const arr = [4,77,2,5,33,4,2,7,9,4,666,333,2,555,66,4,234]
    2. function partition (arr, left, right) {
    3. var pivot = arr[Math.floor((left + right) / 2)]
    4. let i = left
    5. let j = right
    6. console.log('pivot', pivot, i, j)
    7. while (i <= j) {
    8. while (arr[i] < pivot) {
    9. i++
    10. }
    11. while (arr[j] > pivot) {
    12. j--
    13. }
    14. if (i <= j) {
    15. swap(arr, i, j)
    16. i++
    17. j--
    18. }
    19. }
    20. return i
    21. }
    22. function quick(arr, left, right) {
    23. let index = 0
    24. if (arr.length > 1) {
    25. index = partition(arr, left, right)
    26. if (left < index - 1) {
    27. quick(arr,left,index - 1)
    28. }
    29. if (index < right) {
    30. quick(arr,index,right)
    31. }
    32. }
    33. return arr
    34. }
    35. function swap(arr, i, j) {
    36. let temp = arr[i]
    37. arr[i] = arr[j]
    38. arr[j] = temp
    39. }
    40. console.log(quick(arr, 0, arr.length - 1));

    Swift

    1. func patition( arr:inout Array<Int>, left: Int, right: Int) -> Int {
    2. let pivot = arr[(left + right) / 2]
    3. var i = left
    4. var j = right
    5. while i <= j {
    6. while arr[i] < pivot {
    7. i = i + 1
    8. }
    9. while arr[j] > pivot {
    10. j = j - 1
    11. }
    12. if i <= j {
    13. arr.swapAt(i, j)
    14. i = i + 1
    15. j = j - 1
    16. }
    17. }
    18. return i
    19. }
    20. func quick(arr: inout Array<Int>, left: Int, right: Int) -> Array<Int> {
    21. if arr.count == 1 {
    22. return arr
    23. }
    24. var index = 0
    25. if arr.count > 0 {
    26. index = patition(arr: &arr, left: left, right: right)
    27. if left < index - 1 {
    28. let _ = quick(arr: &arr, left: left, right: index - 1)
    29. }
    30. if index < right {
    31. let _ = quick(arr: &arr, left: index, right: right)
    32. }
    33. }
    34. return arr
    35. }