时间复杂度: O(nLog^n)
    归并算法是一种分治算法,思想是将原始数组切分成较小的数组,直到每个数组只有一个位置,接着将小数组合并成较大的数组,直到最后只有一个排序完毕的数组

    JavaScript

    1. const arr = [4,77,2,5,33,4,2,7,9,4,666,333,2,555,66,4,234]
    2. function mergeSortRec (arr) {
    3. let length = arr.length
    4. if (length === 1) {
    5. return arr
    6. }
    7. let mid = Math.floor(length / 2)
    8. let left = arr.slice(0, mid)
    9. let right = arr.slice(mid, length)
    10. return merge(mergeSortRec(left),mergeSortRec(right))
    11. }
    12. function merge(left, right) {
    13. var result = [];
    14. let il = 0;
    15. let ir = 0;
    16. while (il < left.length && ir < right.length) {
    17. if (left[il] < right[ir]) {
    18. result.push(left[il])
    19. il++
    20. }else{
    21. result.push(right[ir])
    22. ir++
    23. }
    24. }
    25. while (il < left.length) {
    26. result.push(left[il])
    27. il++
    28. }
    29. while (ir < right.length) {
    30. result.push(right[ir])
    31. ir++
    32. }
    33. return result
    34. }
    35. console.log('mergeSortRec(arr) >>> ' ,mergeSortRec(arr));

    Swift

    1. func mergeSortRec(arr: Array<Int>) -> Array<Int> {
    2. let length = arr.count
    3. if length == 1 {
    4. return arr
    5. }
    6. let mid: Int = arr.count / 2
    7. let left:Array<Int> = Array(arr[(0 ..< mid)])
    8. let right:Array<Int> = Array(arr[(mid ..< length)])
    9. return mergeSort(left: mergeSortRec(arr: left), right: mergeSortRec(arr: right))
    10. }
    11. func mergeSort(left:Array<Int>, right: Array<Int>) -> Array<Int> {
    12. var result:Array<Int> = []
    13. var il = 0
    14. var ir = 0
    15. while il < left.count && ir < right.count {
    16. if left[il] < right[ir] {
    17. result.append(left[il])
    18. il = il + 1
    19. }else{
    20. result.append(right[ir])
    21. ir = ir + 1
    22. }
    23. }
    24. while il < left.count {
    25. result.append(left[il])
    26. il = il + 1
    27. }
    28. while ir < right.count {
    29. result.append(right[ir])
    30. ir = ir + 1
    31. }
    32. return result
    33. }