Swift 算法实现之归并排序

1,299 阅读2分钟

李峰峰博客

总有一天你会为今天的自己感到自豪

一、概述

归并排序是创建在归并操作上的一种有效的排序算法,效率为O(n log n)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法的一个非常典型的应用,且各层分治递归可以同时进行。归并操作也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。

 

二、实现思路及代码

首先来看一下归并操作,和之前一样,仍然按照个人习惯使用递归的方法(假设序列共有n个元素):

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

例如对于序列[6, 202, 100, 301, 38, 8, 1],其归并步骤如下:

Snip20170403_3

下面是从网上找的一张归并排序gif图:

20160917001326254

 

Swift实现:

//归并排序
func mergeSort(_ array: Array<Int>) -> Array<Int> {
    
    //将数组中的每一个元素放入一个数组中
    var tempArray: Array<Array<Int>> = []
    for item in array {
        var subArray: Array<Int> = []
        subArray.append(item)
        tempArray.append(subArray)
    }
    
    //对这个数组中的数组进行合并,直到合并完毕为止
    while tempArray.count != 1 {
        var i = 0
        while i < tempArray.count - 1 {
            tempArray[i] = _mergeArray(tempArray[i], tempArray[i + 1])
            tempArray.remove(at: i + 1)
            i = i + 1
        }
    }
    
    return tempArray.first!
}


//将两个有序数组进行合并
func _mergeArray(_ firstArray: Array<Int>, _ secondArray: Array<Int>) -> Array<Int> {
    var resultArray: Array<Int> = []
    var firstIndex = 0
    var secondIndex = 0
    
    while firstIndex < firstArray.count && secondIndex < secondArray.count {
        if firstArray[firstIndex] < secondArray[secondIndex] {
            resultArray.append(firstArray[firstIndex])
            firstIndex += 1
        } else {
            resultArray.append(secondArray[secondIndex])
            secondIndex += 1
        }
    }
    
    while firstIndex < firstArray.count {
        resultArray.append(firstArray[firstIndex])
        firstIndex += 1
    }
    
    while secondIndex < secondArray.count {
        resultArray.append(secondArray[secondIndex])
        secondIndex += 1
    }
    
    return resultArray
}

原创文章,转载请注明: 转载自李峰峰博客

本文链接地址: Swift算法实现之归并排序