Swift 3.0 归并排序

作者: Jiubao | 来源:发表于2016-07-26 12:09 被阅读44次

归并排序:

  1. 将序列每相邻两个数字进行归并操作,形成 floor ( n/2
    ) 个序列,排序后每个序列包含两个元素
  2. 将上述序列再次归并,形成 floor ( n/4
    )
    个序列,每个序列包含四个元素
  3. 重复步骤2,直到所有元素排序完毕

MergeSort.swift如下:

//归并排序 从小到大排序

var a = [6, 5, 4, 3, 2, 1]
print("a is \(a)")

func merge( array:inout [Int], first:Int, mid:Int, last:Int){
    print("")
    print("merge called: array is \(array), first is \(first), mid is \(mid), last is \(last)")
    
    var tempArray = Array<Int>()
    var indexA = first
    var indexB = mid
    while indexA < mid && indexB < last {
        if array[indexA] < array[indexB]{
            tempArray.append(array[indexA])
            print("append \(array[indexA]) to tempArray while indexA \(indexA) < mid \(mid) && indexB \(indexB) < last \(last) and array[indexA] \(array[indexA]) < array[indexB] \(array[indexB])")
            indexA += 1
        }else{
            tempArray.append(array[indexB])
            print("append \(array[indexB]) to tempArray while indexA \(indexA) < mid \(mid) && indexB \(indexB) < last \(last) and array[indexA] \(array[indexA]) >= array[indexB] \(array[indexB])")
            indexB += 1
        }
    }
    
    while indexA < mid {
        tempArray.append(array[indexA])
        print("append \(array[indexA]) to tempArray while indexA \(indexA) < mid \(mid) ")
        indexA += 1
    }
    
    while indexB < last{
        tempArray.append(array[indexB])
        print("append \(array[indexB]) to tempArray while indexB \(indexB) < last \(last) ")
        indexB += 1
    }
    print("tempArray is \(tempArray)")
    
    var index = 0
    for item in tempArray{
        array[first + index] = item
        index += 1
    }
    
    print("")
    print("merge finished: array is \(array), first is \(first), mid is \(mid), last is \(last)")
    print("")
}

func mergeSort(array:inout [Int], first:Int, last:Int){
    if first+1 < last{
        print("")
        print("====== start mergeSort loop")
        
        let mid = (first + last)/2
        
        print("first is \(first), last is \(last), mid is \(mid), array is \(array)")
        
        mergeSort(array: &array, first: first, last: mid)
        mergeSort(array: &array, first: mid, last: last)
        merge(array: &array, first: first, mid: mid, last: last)
        
        print("array now is \(array)")
    } else {
        print("-- end mergeSort loop, now first is \(first), last is \(last), array is \(array)")
    }
}

print("")

mergeSort(array:&a, first:0, last: a.count)
//merge(array:&a, first: 0, mid:3, last:a.count)

print("")
//排序完成
print("sorted a is \(a)")

Terminal运行swift MergeSort.swift可以看到:

a is [6, 5, 4, 3, 2, 1]


====== start mergeSort loop
first is 0, last is 6, mid is 3, array is [6, 5, 4, 3, 2, 1]

====== start mergeSort loop
first is 0, last is 3, mid is 1, array is [6, 5, 4, 3, 2, 1]
-- end mergeSort loop, now first is 0, last is 1, array is [6, 5, 4, 3, 2, 1]

====== start mergeSort loop
first is 1, last is 3, mid is 2, array is [6, 5, 4, 3, 2, 1]
-- end mergeSort loop, now first is 1, last is 2, array is [6, 5, 4, 3, 2, 1]
-- end mergeSort loop, now first is 2, last is 3, array is [6, 5, 4, 3, 2, 1]

merge called: array is [6, 5, 4, 3, 2, 1], first is 1, mid is 2, last is 3
append 4 to tempArray while indexA 1 < mid 2 && indexB 2 < last 3 and array[indexA] 5 >= array[indexB] 4
append 5 to tempArray while indexA 1 < mid 2 
tempArray is [4, 5]

merge finished: array is [6, 4, 5, 3, 2, 1], first is 1, mid is 2, last is 3

array now is [6, 4, 5, 3, 2, 1]

merge called: array is [6, 4, 5, 3, 2, 1], first is 0, mid is 1, last is 3
append 4 to tempArray while indexA 0 < mid 1 && indexB 1 < last 3 and array[indexA] 6 >= array[indexB] 4
append 5 to tempArray while indexA 0 < mid 1 && indexB 2 < last 3 and array[indexA] 6 >= array[indexB] 5
append 6 to tempArray while indexA 0 < mid 1 
tempArray is [4, 5, 6]

merge finished: array is [4, 5, 6, 3, 2, 1], first is 0, mid is 1, last is 3

array now is [4, 5, 6, 3, 2, 1]

====== start mergeSort loop
first is 3, last is 6, mid is 4, array is [4, 5, 6, 3, 2, 1]
-- end mergeSort loop, now first is 3, last is 4, array is [4, 5, 6, 3, 2, 1]

====== start mergeSort loop
first is 4, last is 6, mid is 5, array is [4, 5, 6, 3, 2, 1]
-- end mergeSort loop, now first is 4, last is 5, array is [4, 5, 6, 3, 2, 1]
-- end mergeSort loop, now first is 5, last is 6, array is [4, 5, 6, 3, 2, 1]

merge called: array is [4, 5, 6, 3, 2, 1], first is 4, mid is 5, last is 6
append 1 to tempArray while indexA 4 < mid 5 && indexB 5 < last 6 and array[indexA] 2 >= array[indexB] 1
append 2 to tempArray while indexA 4 < mid 5 
tempArray is [1, 2]

merge finished: array is [4, 5, 6, 3, 1, 2], first is 4, mid is 5, last is 6

array now is [4, 5, 6, 3, 1, 2]

merge called: array is [4, 5, 6, 3, 1, 2], first is 3, mid is 4, last is 6
append 1 to tempArray while indexA 3 < mid 4 && indexB 4 < last 6 and array[indexA] 3 >= array[indexB] 1
append 2 to tempArray while indexA 3 < mid 4 && indexB 5 < last 6 and array[indexA] 3 >= array[indexB] 2
append 3 to tempArray while indexA 3 < mid 4 
tempArray is [1, 2, 3]

merge finished: array is [4, 5, 6, 1, 2, 3], first is 3, mid is 4, last is 6

array now is [4, 5, 6, 1, 2, 3]

merge called: array is [4, 5, 6, 1, 2, 3], first is 0, mid is 3, last is 6
append 1 to tempArray while indexA 0 < mid 3 && indexB 3 < last 6 and array[indexA] 4 >= array[indexB] 1
append 2 to tempArray while indexA 0 < mid 3 && indexB 4 < last 6 and array[indexA] 4 >= array[indexB] 2
append 3 to tempArray while indexA 0 < mid 3 && indexB 5 < last 6 and array[indexA] 4 >= array[indexB] 3
append 4 to tempArray while indexA 0 < mid 3 
append 5 to tempArray while indexA 1 < mid 3 
append 6 to tempArray while indexA 2 < mid 3 
tempArray is [1, 2, 3, 4, 5, 6]

merge finished: array is [1, 2, 3, 4, 5, 6], first is 0, mid is 3, last is 6

array now is [1, 2, 3, 4, 5, 6]

sorted a is [1, 2, 3, 4, 5, 6]

源码引用参考[http://panl.github.io/2015/12/10/Algorithm/]
资料引用[https://zh.wikipedia.org/wiki/归并排序#C.2B.2B]

相关文章

  • Swift 3.0 归并排序

    归并排序: 将序列每相邻两个数字进行归并操作,形成 floor ( n/2) 个序列,排序后每个序列包含两个元素 ...

  • swift中几种排序算法原理的UI动态实现

    swift中的排序算法总结 冒泡排序 选择排序 快速排序 插入排序 堆排序 归并排序 系统排序 我们将这几种数组排...

  • 排序算法

    约定 选择排序 冒泡排序 插入排序 希尔排序 归并排序1. 归并方法2. 自顶向下归并排序3. 自底向上归并排序 ...

  • 排序二:归并、快排

    文章结构 归并排序 快速排序 源码 1. 归并排序 1.1 什么是归并排序 归并排序的思想是:将待排序的区间平分成...

  • java归并排序

    归并排序什么是归并排序:图解归并排序归并排序有两种实现方式,一是基于递归,而是基于迭代1)基于递归的归并排序: 基...

  • 归并排序(swift)

  • 归并排序(Swift)

    最近在学习算法,归并排序和快速排序都用到分治思想,编程实现方式是通过递归。本文旨在给Swift语言开发者提供编程思...

  • Swift 归并排序

    Swift 归并排序 基本原理: 对于两个有序子数组,合并成一个有序数组,是一个较为简单的事情。可以对两个子数组,...

  • 算法—排序篇2

    1、归并排序(Merging Sort) 归并排序(Merging Sort): 就是利用归并的思想实现排序⽅法....

  • 常见的排序算法(2)

    要点 快速排序 归并排序 1.快速排序 2.归并排序

网友评论

  • 1ba5bc9bf644:厉害厉害,真的厉害。我最近在看算法导论,这里的归并排序头疼死我了,按照它的伪代码,根本不知道swift3.0怎么实现,感觉还是自己基础不好。谢谢你,帮了大忙了。
    Jiubao:@抬头看见柠檬树 :+1:

本文标题:Swift 3.0 归并排序

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