美文网首页
【数据结构与算法 - Swift实现】13 - 归并排序 (Me

【数据结构与算法 - Swift实现】13 - 归并排序 (Me

作者: Lebron_James | 来源:发表于2019-05-07 00:07 被阅读0次

归并排序算法是一个效率很高的排序算法,时间复杂度为 O(n log n)。它的算法思想是先分组,各小组排好序后,再把结果合并。

原理解析

以下面的数组为例来讲解一下归并排序的原理:

    +--------+    +--------+    +--------+    +--------+
    |        |    |        |    |        |    |        |
    |    8   |    |    7   |    |   14   |    |    5   |
    |        |    |        |    |        |    |        |
    +--------+    +--------+    +--------+    +--------+
  1. 首先把数组分成两半:
    +--------+  +--------+        +--------+  +--------+
    |        |  |        |        |        |  |        |
    |    8   |  |    7   |        |   14   |  |    5   |
    |        |  |        |        |        |  |        |
    +--------+  +--------+        +--------+  +--------+
  1. 继续把上面的两个子数组分别分成两半:
    +--------+        +--------+        +--------+        +--------+
    |        |        |        |        |        |        |        |
    |    8   |        |    7   |        |   14   |        |    5   |
    |        |        |        |        |        |        |        |
    +--------+        +--------+        +--------+        +--------+

到目前为止,每个子数组只有一个元素,不能再继续往下分组,分组的操作到此完成。

  1. 子数组按照小到大的顺序合并:
    +--------+  +--------+        +--------+  +--------+
    |        |  |        |        |        |  |        |
    |    7   |  |    8   |        |    5   |  |   14   |
    |        |  |        |        |        |  |        |
    +--------+  +--------+        +--------+  +--------+
  1. 再继续合并:
    +--------+    +--------+    +--------+    +--------+
    |        |    |        |    |        |    |        |
    |    5   |    |    7   |    |    8   |    |   14   |
    |        |    |        |    |        |    |        |
    +--------+    +--------+    +--------+    +--------+

完成排序。

实现

func mergeSort<Element: Comparable>(_ array: [Element]) -> [Element] {
    guard array.count > 1 else {
        return array
    }
    let middle = array.count / 2
    let left = mergeSort(Array(array[..<middle]))
    let right = mergeSort(Array(array[middle...]))
    return merge(left, right)
}

private func merge<Element: Comparable>(_ left: [Element],
                                        _ right: [Element]) -> [Element] {
    var leftIndex = 0
    var rightIndex = 0
    var result: [Element] = []
    
    while leftIndex < left.count && rightIndex < right.count {
        let leftElement = left[leftIndex]
        let rightElement = right[rightIndex]
        
        if leftElement < rightElement {
            result.append(leftElement)
            leftIndex += 1
        } else if leftElement > rightElement {
            result.append(rightElement)
            rightIndex += 1
        } else {
            result.append(leftElement)
            leftIndex += 1
            result.append(rightElement)
            rightIndex += 1
        }
    }
    
    if leftIndex < left.count {
        result.append(contentsOf: left[leftIndex...])
    }
    if rightIndex < right.count {
        result.append(contentsOf: right[rightIndex...])
    }
    
    return result
}

mergeSort方法:利用递归把数组分割到最小,然后调用 merge方法

merge方法

  • leftIndexrightIndex 记录左右两个子数组当前索引;result 用于存储左右两个子数组合并的结果
  • while 循环里面,判断当前左右子索引对应元素的大小,谁小就先把谁添加到 result 中,如果一样大,两个都添加
  • while 循环结束后,如果左右子数组还有剩下的元素,则直接添加到最后面。

测试

let ints = [4,5,5467,73,234,678,87,989]
let sortedInts = mergeSort(ints)
print(sortedInts)

// 结果
[4, 5, 73, 87, 234, 678, 989, 5467]

结果正确。

完整代码 >>

参考资料

Data Structures and Algorithms in Swift --- raywenderlich.com,如果想看原版书籍,请点击链接购买。

欢迎加入我管理的Swift开发群:536353151

下一篇文章:【数据结构与算法 - Swift实现】14 - 快速排序 (Quicksort)

相关文章

  • 排序算法-堆排序

    参考: Java排序算法(五):堆排序 【算法与数据结构】图说堆排序 【数据结构】排序算法:希尔、归并、快速、堆排...

  • 【数据结构与算法 - Swift实现】13 - 归并排序 (Me

    归并排序算法是一个效率很高的排序算法,时间复杂度为 O(n log n)。它的算法思想是先分组,各小组排好序后,再...

  • 数据结构与算法--归并排序

    数据结构与算法--归并排序 归并排序 归并排序基于一种称为“归并”的简单操作。比如考试可能会分年级排名和班级排名,...

  • 2018-06-30

    排序算法之归并排序 归并排序算法是排序算法中的经典算法之一,其核心思想是利用归并的思想实现的排序方法,该算法采用经...

  • 算法与数据结构路线图

    学习算法与数据结构,深刻理解计算机科学 排序算法:插入、冒泡、选择、希尔、快速、归并、堆排序、计数排序、桶排序、基...

  • 排序算法之归并排序

    归并排序(Merge Sort) 归并排序是利用归并的思想实现排序的方式,该算法采用的是经典的分治算法 归并排序过...

  • 第三章:高级排序算法

    归并排序算法(mergeSort) 算法思想:Python使用函数实现: 自底向上的归并排序算法 算法思想:Pyt...

  • 归并排序

    图解排序算法(四)之归并排序 基本思想 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用...

  • 归并排序&快速排序

    归并排序 利用归并的思想实现排序方法,该算法采用经典的分治策略,分而治之。 代码实现 基础设置 归并排序 —— 非...

  • 排序算法详细代码实现

    算法分类 算法时间复杂度 选择排序 插入排序 C++实现 Python实现 冒泡排序 Python实现 归并排序 ...

网友评论

      本文标题:【数据结构与算法 - Swift实现】13 - 归并排序 (Me

      本文链接:https://www.haomeiwen.com/subject/ivkjoqtx.html