算法——归并排序算法

归并排序大概思路是分治思想,将数组按照折半来逐级划分,直到只剩下一个元素(此时肯定是有序的),然后再将有序数组进行逐个合并,就得到了排好序的数组了,因此叫做归并排序。

swift:

import Foundation

var arr = [10,9,8,7,6,4,5,3,2,1]
mergeSort(array: &arr, left: 0, right: arr.count - 1)
print(arr)

func mergeSort(array: inout [Int], left: Int, right: Int) {
    if left >= right { return }	//这里一定是大于等于,没有等于号会陷入死循环
    let mid = (left + right) / 2
    mergeSort(array: &array, left: left, right: mid)
    mergeSort(array: &array, left: mid + 1, right: right)
    var temp = Array<Int>.init(repeating: 0, count: right - left + 1)
    var i = left
    var j = mid + 1
    var tempIndex = 0
    //两个子数组,找出最小的数依次合并
    while i <= mid, j <= right {
        if array[i] < array[j] {
            temp[tempIndex] = array[i]
            i += 1
            tempIndex += 1
        }else{
            temp[tempIndex] = array[j]
            j += 1
            tempIndex += 1
        }
    }
    //两个子数组数量不一定相等,把剩下的数字直接合并过来
    //下面两个while实际只会有一个执行
    while i <= mid {
        temp[tempIndex] = array[i]
        i += 1
        tempIndex += 1
    }
    while j <= right {
        temp[tempIndex] = array[j]
        j += 1
        tempIndex += 1
    }
    //将临时数组转化到arr中
    for i in 0..<(right - left + 1) {
        array[left + i] = temp[i]
    }
}

时间复杂度:O(n log(n))
比较简单,快速的排序算法,特点是稳定性高

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值