排序算法
1.冒泡排序
从开始位置两两比较,持续n轮
// 冒泡排序let bubbleSort = (arr) => {const len = arr.lengthfor (let i = 0; i < len - 1; i++) {// 外层循环控制轮数for (let j = 0; j < len - i - 1; j++) {// 内层循环控制比较次数if (arr[j] > arr[j + 1]) {// 交换条件const temp = arr[j]arr[j] = arr[j + 1]arr[j + 1] = temp}}}return arr}let array = [421, 33, 2, 45, 56, 16, 74, 844, 923, 140]console.log(bubbleSort(array)) // [2, 16, 33, 45, 56, 74, 140, 421, 844, 923]
2.选择排序
每次选出最大/最小值 持续n轮
// 选择排序let selectSort = (arr) => {const len = arr.length for (let i = 0; i < len - 1; i++) {let minIndex = ifor (let j = i + 1; j < len; j++) {if (arr[j] < arr[minIndex]) {minIndex = j}}if (minIndex !== i) {const temp = arr[i]arr[i] = arr[minIndex]arr[minIndex] = temp}}return arr}let array = [421, 33, 2, 45, 56, 16, 74, 844, 923, 140]console.log(selectSort(array)) // [2, 16, 33, 45, 56, 74, 140, 421, 844, 923]
3.插入排序
默认一个已排好序的数组 递增的往这个数组内插入元素
// 插入排序let insertSort = (arr) => {let len = arr.lengthfor (let i = 1; i < len; i++) {let j = i - 1let temp = arr[i]while (j >= 0 && arr[j] > temp) {arr[j + 1] = arr[j]j--}arr[j + 1] = temp}return arr}let array = [421, 33, 2, 45, 56, 16, 74, 844, 923, 140]console.log(insertSort(array)) // [2, 16, 33, 45, 56, 74, 140, 421, 844, 923]
4.希尔排序
增量式的 插入排序 正常的插入排序间隔为1 希尔排序默认设置间隔大于1 然后递减为1
// 希尔排序function shellSort(arr) {let len = arr.lengthlet step = 1let dis = 3// 设置最大间隔while (step < len / dis) {step = step * dis + 1}// 间隔递减for (; step > 0; step = Math.floor(step / dis)) {// 单个间隔的插入排序for (let i = step; i < len; i++) {let tmp = arr[i]let j = i - stepwhile (j >= 0 && arr[j] > tmp) {arr[j + step] = arr[j]j -= step}arr[j + step] = tmp}}return arr}let array = [421, 33, 2, 45, 56, 16, 74, 844, 923, 140]console.log(shellSort(array)) // [2, 16, 33, 45, 56, 74, 140, 421, 844, 923]