时间复杂度: 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.lengthif (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.countif length == 1 {return arr}let mid: Int = arr.count / 2let 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 = 0var ir = 0while 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}
