携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情 。如果哪里写的不对,请大家评论批评。
什么是归并
归并排序是建立在合并操作上的一种有效的。稳定的排序算法。该算法采用的分治法。将已经一个个数据拆分成无数个子数组,然后再将相邻的两个数组合并,一直递归下去,知道合成一个有序的数组。
分析
归并:肯定要有递归,不了解递归的同学可以先去学习一下,有时间咱们在分享递归。 采用分治法,这里可以理解二分法,然后不断地(递归)去继续二分,一直到分解成独立的各个。
然后再沿着递归过来的轨道,从个体到个体去比较去排序。
然后是两个Vs两个比较排序
然后是3个...
看不懂?没关系...看图解
图解归并排序
如果还是看不懂,建议去理解理解递归~~~
代码(Swift)
func mergeSort(_ list: inout [Int] , left: Int, right :Int){
if left >= right {
return;
}
let mid = left + (right - left) / 2
mergeSort(&list, left: left, right: mid)
mergeSort(&list, left: mid + 1, right:right)
merge(&list, left: left, mid: mid, right: right)
}
func merge(_ list: inout [Int] ,left: Int,mid: Int ,right :Int) {
print("3---\(left)--\(mid)--\(right)")
var leftIndex = left
var rightIndex = mid + 1
var tempList:[Int] = []
while leftIndex <= mid && rightIndex <= right {
// 左边第一个 和 右边第一个比较,假设左边小,存放临时数组,左边下标+1
if list[leftIndex] < list[rightIndex] {
tempList.append(list[leftIndex])
leftIndex += 1
}else{
// 如果相等或者右边小,取右边的值存放临时数据,右边下标+1
tempList.append(list[rightIndex])
rightIndex += 1
}
}
// 最后肯定有一个数组剩下至少一位数据,全部最后在数组最后
while leftIndex <= mid {
tempList.append(list[leftIndex])
leftIndex += 1
}
while rightIndex <= right {
tempList.append(list[rightIndex])
rightIndex += 1
}
var ans = 0
for i in left...right {
list[i] = tempList[ans]
ans += 1
}
}
var list : Array<Int> = [2, 3, 8, 1, 4, 9, 10, 7, 16]
mergeSort(&list, left: 0, right: list.count - 1)
print(list)