js实现排序算法(快速排序,冒泡排序,插入排序,选择排序)
快速排序:
找到一个基数,在一轮排序后:这个数之前的数都比它小,这个数之后的数都比它大;然后以这个数为分割对它前面的数和后面的数再做相同的操作即可,注意找到临界点
function sort(arr = []) { if (!Array.isArray(arr) || arr.length < 2) return arr; function sortWrapper(args, s, e) { let temp = args[e]; let i = s, j = e; while (i !== j) { while (args[i] <= temp && i < j) { i++; } [args[i], args[j]] = [args[j], args[i]]; while (args[j] >= temp && i < j) { j-- } [args[i], args[j]] = [args[j], args[i]]; } if (s <= i - 1) sortWrapper(args, s, i - 1); if (e >= i + 1) sortWrapper(args, i + 1, e); } sortWrapper(arr, 0, arr.length - 1); return arr; } new Array(5).fill(0).forEach(() => { const arr = Array(20).fill(0).map(() => parseInt(Math.random() * 100)); console.log('排序前', arr); console.log('排序后', sort(arr)); console.log('############################') })
冒泡排序:
每一轮通过交换的方式交换出一个最大值放在数组末尾,上次交换出的最后一个数不应该在进行多余的交互,故每次交换的数组长度需要减一
function sort(arr = []) { if (!Array.isArray(arr) || arr.length < 2) return arr; for (let i = 0; i < arr.length; i++) { for (let j = 0; j < arr.length - i; j++) { if (arr[j] > arr[j + 1]) { [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]; } } } return arr; } new Array(5).fill(0).forEach(() => { const arr = Array(20).fill(0).map(() => parseInt(Math.random() * 100)); console.log('排序前', arr); console.log('排序后', sort(arr)); console.log('############################') })
选择排序:
每次选择出极值放在开头或结尾,下次从剩下的数据中再选出极值,直到数据只剩最后一个
function sort(arr = []) { if (!Array.isArray(arr) || arr.length < 2) return arr; function getMaxIndex(tempArr = []) { if (tempArr.length < 2) return tempArr[0]; let max = 0; for (let i = 1; i < tempArr.length; i++) { max = tempArr[max] > tempArr[i] ? max : i; } return max; } for (let i = 0; i < arr.length - 1; i++) { const tempArr = []; for (let j = 0; j < arr.length - i; j++)tempArr[j] = arr[j]; const maxIndex = getMaxIndex(tempArr); const lastIndex = arr.length - 1 - i; if (maxIndex !== lastIndex) [arr[lastIndex], arr[maxIndex]] = [arr[maxIndex], arr[lastIndex]]; } return arr; } new Array(5).fill(0).forEach(() => { const arr = Array(20).fill(0).map(() => parseInt(Math.random() * 100)); console.log('排序前', arr); console.log('排序后', sort(arr)); console.log('############################') })
插入排序:
从第二个数开始,把这个数拿出来和前面的数做从后向前的对比,如果比它小就插到前面,知道前面的数交换完(比这个数大的都往后挪一个位置)
function sort(arr = []) { if (!Array.isArray(arr) || arr.length < 2) return arr; for (let i = 0; i < arr.length; i++) { for (let j = i - 1; j > -1; j--) { if (arr[j] >= arr[j + 1]) [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]; } } return arr; } new Array(5).fill(0).forEach(() => { const arr = Array(20).fill(0).map(() => parseInt(Math.random() * 100)); console.log('排序前', arr); console.log('排序后', sort(arr)); console.log('############################') })