Swift 归并排序详解

72 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情 。如果哪里写的不对,请大家评论批评。

什么是归并

归并排序是建立在合并操作上的一种有效的。稳定的排序算法。该算法采用的分治法。将已经一个个数据拆分成无数个子数组,然后再将相邻的两个数组合并,一直递归下去,知道合成一个有序的数组。

分析

归并:肯定要有递归,不了解递归的同学可以先去学习一下,有时间咱们在分享递归。 采用分治法,这里可以理解二分法,然后不断地(递归)去继续二分,一直到分解成独立的各个。

然后再沿着递归过来的轨道,从个体到个体去比较去排序。

然后是两个Vs两个比较排序

然后是3个...

看不懂?没关系...看图解

图解归并排序

归并.drawio.png

如果还是看不懂,建议去理解理解递归~~~

代码(Swift)

func mergeSort(_ list: inout [Int] , left: Int, right :Int){
    if left >= right {
        return;
    }
    let mid = left + (right - left) / 2
    mergeSort(&list, left: left, right: mid)
    mergeSort(&list, left: mid + 1, right:right)
    merge(&list, left: left, mid: mid, right: right)
}

func merge(_ list: inout [Int] ,left: Int,mid: Int ,right :Int) {
    print("3---\(left)--\(mid)--\(right)")
    
    var leftIndex = left
    var rightIndex = mid + 1
    var tempList:[Int] = []
    while leftIndex <= mid && rightIndex <= right {
        // 左边第一个 和 右边第一个比较,假设左边小,存放临时数组,左边下标+1
        if list[leftIndex] < list[rightIndex] {
            tempList.append(list[leftIndex])
            leftIndex += 1
        }else{
            // 如果相等或者右边小,取右边的值存放临时数据,右边下标+1
            tempList.append(list[rightIndex])
            rightIndex  += 1
        }
    }
 
    // 最后肯定有一个数组剩下至少一位数据,全部最后在数组最后
    while leftIndex <= mid {
        tempList.append(list[leftIndex])
        leftIndex += 1
    }

    while rightIndex <= right {
        tempList.append(list[rightIndex])
        rightIndex  += 1
    }
    
    var ans = 0
    for i in left...right {
        list[i] = tempList[ans]
        ans += 1
    }
}

var list : Array<Int> = [2, 3, 8, 1, 4, 9, 10, 7, 16]
mergeSort(&list, left: 0, right: list.count - 1)
print(list)