李峰峰博客
总有一天你会为今天的自己感到自豪一、概述
归并排序是创建在归并操作上的一种有效的排序算法,效率为O(n log n)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法的一个非常典型的应用,且各层分治递归可以同时进行。归并操作也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。
二、实现思路及代码
首先来看一下归并操作,和之前一样,仍然按照个人习惯使用递归的方法(假设序列共有n个元素):
- 将序列每相邻两个数字进行归并操作,形成floor(n/2)个序列,排序后每个序列包含两个元素
- 将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素
- 重复步骤2,直到所有元素排序完毕
例如对于序列[6, 202, 100, 301, 38, 8, 1],其归并步骤如下:

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

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算法实现之归并排序