二. 传统技法:排序
几种排序算法:冒泡 快排 归并 堆排序(堆排序被用在优先级算法上,在 react 的调度里就用的这个)。
1. 冒泡排序
function sort_bubble(list) {for (let j = list.length; j > 0; j --) {for (let i = 0; i < j; i++) { // 每一轮都能把最大数移动到最右端let tmp;if (list[i] > list[i + 1]) {tmp = list[i];list[i] = list[i + 1];list[i + 1] = tmp;}}}return list;}console.log('排序结果:', sort_bubble(l));
2. 快速排序
-> 据说是 冒泡的改进版
function sort_fast(list) {if (list.length <= 1) {return list;}let pivot = list[list.length - 1];let leftArr = [];let rightArr = [];for (let i = 0; i < list.length - 1; i ++) {let tmp = list[i];if (tmp < pivot) {leftArr.push(tmp);} else {rightArr.push(tmp);}}leftArr = sort_fast(leftArr);rightArr = sort_fast(rightArr);return [...leftArr, pivot, ...rightArr];}console.log('快速排序结果:', sort_fast(l));
关于快速和冒泡的论述:http://data.biancheng.net/view/117.html
3. 归并排序
尽早看视频的时候,听到对分治思想的阐述:英文是 divide and conque, 中文为分而治之!突然就想起来要怎么来写归并排序了。
归并排序的想法事实上非常的大胆,不同于一般算法过程,是一步一步的,我们要分为两个层次去看问题:
第一步,假设算法已经写完,直接调用虚拟api 实现整体架构;第二步实现那虚拟api,这里面虚拟 api 有两个:
sort 和 mergeSortedArrs 都是,实际过程我们先写哪个,答案是一起写完。
// 归并排序 -> 分治思想的集合let arr = [4, 4, 5, 6, 1, 2];function sort(arr) {if (arr.length <= 1) {return arr;}let mid = arr.length >>> 1;return mergeSortedArrs(sort(arr.slice(0, mid)), sort(arr.slice(mid))); // 分治思想的体现}function mergeSortedArrs(arr1, arr2) {let result = [];if (arr1.length === 0) {result = arr2.slice(0);}if (arr2.length === 0) {result = arr1.slice(0);}let i = 0;let j = 0;while((i < arr1.length) || (j < arr2.length)) {if (i >= arr1.length) {result = result.concat(arr2.slice(j));break; // 这是 while 循环的出口} else if (j >= arr2.length) {result = result.concat(arr1.slice(i));break; // 这是 while 循环的出口}let item1 = arr1[i];let item2 = arr2[j];if (item1 < item2) {result.push(item1);i++;} else {result.push(item2);j++}}return result;}// console.log('合并有序数组:', mergeSortedArrs([1,2,10], [4,5,6]));console.log('归并排序:', sort([8, 9, 1, 3, 10, 17]));
