概念
归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
算法原理
首先,我们先来完成合并的方法,即是将两个有序子序列合并成一个有序序列。
比如以下例子:
后面依此类推
// 合并
function merge(arr, startIndex, midIndex, endIndex) {
let i = startIndex
let j = midIndex + 1
let k = 0
let temp = []
while(i <= midIndex && j <= endIndex){
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++]
} else {
temp[k++] = arr[j++]
}
}
// 左侧数组已排序完毕, 右侧还有数据
while(i <= midIndex) {
temp[k++] = arr[i++]
}
while(j <= endIndex) {
temp[k++] = arr[j++]
}
for(let index = 0; index < temp.length; index++) {
arr[index + startIndex] = temp[index]
}
}
// 归并排序
function mergeSort(arr, startIndex = 0, endIndex = arr.length - 1) {
// 递归结束条件
if (startIndex >= endIndex) {
return
}
const midIndex = ~~((startIndex + endIndex) / 2)
mergeSort(arr, startIndex, midIndex)
mergeSort(arr, midIndex + 1, endIndex)
merge(arr, startIndex, midIndex, endIndex)
}