归并排序 - javascript
归并排序(mergeSort),如其名,递归合并;采用分治法;先分,将数组反复二分,直到为一个元素;后治,在分的基础上两两元素对比合并;
归并排序是非常稳定的排序方法,时间复杂幅度最好最坏平均都是NlogN
基本步骤
- 递归拆分,直到剩下一个元素
- 两两元素对比合并
如图所示
以上就是基本步骤;
下图是两两数组对比合并的基本步骤:
代码描述
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| let arr = [5, 4, 3, 6, 9]; function merge(left, right) { console.log(left, right); let result = []; let i = 0; let j = 0; while (i < left.length && j < right.length) { if (left[i] < right[j]) { result.push(left[i++]) } if (left[i] > right[j]) { result.push(right[j++]) } } if (i < left.length) { result.push(...left.slice(i)) } else { result.push(...right.slice(j)) } return result; }
function mergeSort(arr, type) { if (arr.length < 2) { return arr } let catchIndex = Math.floor(arr.length / 2) let left = mergeSort(arr.slice(0, catchIndex)); let right = mergeSort(arr.slice(catchIndex)); return merge(left, right); }
|
合并基本步骤就是
- 遍历两组数据
- 进行对比大小
- 小的那个值取出来放在第一个位置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| function merge(left, right) { console.log(left, right); let result = []; let i = 0; let j = 0; while (i < left.length && j < right.length) { if (left[i] < right[j]) { result.push(left[i++]) } if (left[i] > right[j]) { result.push(right[j++]) } } if (i < left.length) { result.push(...left.slice(i)) } else { result.push(...right.slice(j)) } return result; }
|