前言
最近在学习算法, 不得不说, 怪难来, 不过, 也很妙, 感觉这些知识太难了, 学会了, 还容易忘, 我觉定记录一下, 争取用最清晰,最简单的语言来描述我学习到的思想
归并排序
这个排序的思想大概是, 利用递归分治思想, 实现排序的过程, 大致过程是先把数组分割成不可分割单位, 打比方 [3,1,4,2,6,5]这个数组, 先分成独立的每个数, 然后合并, 在合并的过程中排序.
宏观理解成 把数组看成两半, 左边排好序, 右边排好序, 然后有一个merge过程让整体有序
merge过程是用两个指针, 一个指向左边数组的开头, 一个指向右边数组的开头
谁小复制谁, 从头复制到尾, 就排好序了
实现
function mergeSort(arr) {
if (!arr || arr.length < 2) {
return
}
process(arr, 0, arr.length - 1)
}
function process(arr, l, r) {
if (l == r) {
return
}
let mid = Math.floor((l + r) / 2)
process(arr, l, mid)
process(arr, mid + 1, r)
merge(arr, l, mid, r)
}
function merge(arr, l, m, r) {
let help = Array(r - l + 1),
i = 0,
p1 = l,
p2 = m + 1
while (p1 <= m && p2 <= r) {
help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++]
}
while (p1 <= m) {
help[i++] = arr[p1++]
}
while (p2 <= r) {
help[i++] = arr[p2++]
}
for (i = 0; i < help.length; i++) {
arr[l + i] = help[i]
}
}
function test() {
let arr = [9, 8, 7, 6, 5, 4, 3, 2, 1]
console.log("before sort", arr)
mergeSort(arr)
console.log("after sort", arr)
}
test()