归并排序大概思路是分治思想,将数组按照折半来逐级划分,直到只剩下一个元素(此时肯定是有序的),然后再将有序数组进行逐个合并,就得到了排好序的数组了,因此叫做归并排序。
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))
比较简单,快速的排序算法,特点是稳定性高