时间复杂度: O(nLog^n)
归并算法是一种分治算法,思想是将原始数组切分成较小的数组,直到每个数组只有一个位置,接着将小数组合并成较大的数组,直到最后只有一个排序完毕的数组
JavaScript
const arr = [4,77,2,5,33,4,2,7,9,4,666,333,2,555,66,4,234]
function mergeSortRec (arr) {
let length = arr.length
if (length === 1) {
return arr
}
let mid = Math.floor(length / 2)
let left = arr.slice(0, mid)
let right = arr.slice(mid, length)
return merge(mergeSortRec(left),mergeSortRec(right))
}
function merge(left, right) {
var result = [];
let il = 0;
let ir = 0;
while (il < left.length && ir < right.length) {
if (left[il] < right[ir]) {
result.push(left[il])
il++
}else{
result.push(right[ir])
ir++
}
}
while (il < left.length) {
result.push(left[il])
il++
}
while (ir < right.length) {
result.push(right[ir])
ir++
}
return result
}
console.log('mergeSortRec(arr) >>> ' ,mergeSortRec(arr));
Swift
func mergeSortRec(arr: Array<Int>) -> Array<Int> {
let length = arr.count
if length == 1 {
return arr
}
let mid: Int = arr.count / 2
let left:Array<Int> = Array(arr[(0 ..< mid)])
let right:Array<Int> = Array(arr[(mid ..< length)])
return mergeSort(left: mergeSortRec(arr: left), right: mergeSortRec(arr: right))
}
func mergeSort(left:Array<Int>, right: Array<Int>) -> Array<Int> {
var result:Array<Int> = []
var il = 0
var ir = 0
while il < left.count && ir < right.count {
if left[il] < right[ir] {
result.append(left[il])
il = il + 1
}else{
result.append(right[ir])
ir = ir + 1
}
}
while il < left.count {
result.append(left[il])
il = il + 1
}
while ir < right.count {
result.append(right[ir])
ir = ir + 1
}
return result
}