常见排序算法
插入排序
function sort(arr) {if (!arr.length || arr.length <=1) return arrfor (let i = 1; i< arr.length; i++) { // 假设第一个已经被定了let j = i - 1 // 找到上一位已经排序好的项目进行开始对比let item = arr[i] // 记录一下当前这个值while(j >=0 && arr[j] > item ) { // 往前对比,j>=0;且所对比的数值如果大于当前数值的话// 说明还可以往下走、并且将对比的值和当前值调换一下位置arr[j+1] = arr[j]j--}// 直到遍历完,确认到j的值、将当前的值赋给j所在的位置arr[j+1] = item // 因为最后一下j--,所以当前的值需要补多一位才是真实的j位置}}
快速排序
function sort(arr) {let len = arr.lengthif (len <=1) return (arr || [])let left = [], right = [], pivot = Math.floor(len/2);for (let i =0; i< len; i++) {if (arr[i] <=arr[pivot]) {left.push(arr[i])} else {right.push(arr[i])}}return sort(left).concat(arr[pivot], sort(right))}
冒泡排序
// 从前面往后面确认function sort(arr) {let len = arr.lengthif (len <=1) return (arr || [])for (let i =0; i<len; i++) {for (let j= i+1; j< len; j++) {if (arr[i] > arr[j]) {[arr[i], arr[j]] = [arr[j], arr[i]] // 交换值}}}return arr}// 相近的两两对比function sort(arr) {let len = arr.lengthif (len <=1) return (arr || [])for(let i = 0; i<len - 1; i++) {for (let j = 0; j< len - 1 -i; j++) { // 因为在对比中会出现arr[j+1],往后取多一位,所以len-1是需要的,不然会报错if (arr[j] > arr[j+1]) {[arr[j], arr[j+1]] = [arr[j+1], arr[j]]}}}return arr}
选择排序
function sort () {let len = arr.lengthif (len <=1) return (arr || [])for (let i=0; i<len; i++) {let index = ifor (let j=i+1; j<len;j++) {if (arr[j]<arr[i]) {index = j}}[arr[i], arr[index]] = [arr[index], arr[i]]}return arr}
希尔排序
function shellsort(arr) {let len = arr.lengthif(len<=1) return arrfor(let gap = Math.floor(len/2); gap >=1;gap = Math.floor(gap/2)) { // 遍历gap// 拿到gap后,针对分组进行按照插入排序法处理for(let i = gap; i<len; i++) {// 下面思维是插入算法的思维,获取当前下标数据和上一个进行大小对比let current_ele = arr[i] // 第一次循环获取这一组中的下标为1的数,往前对比;后续循环可以理解为获取下一个let before_index = i - gap // 第一次循环获取这一组中上一个0个,后续循环可以理解为相对i的上一个,while (before_index >= 0 && arr[before_index] > current_ele) {arr[before_index + gap] = arr[before_index] // 将大的数据往后挪一个空位before_index -= gap}arr[before_index + gap] = current_ele // 将数据插入合适的index位置}}return arr}
归并排序
function merge (left, right) {let result = []while(left.length && right.length) {// 获取数组的第一个,并且改变原有数组的长度if (left[0] < right[0]) {reuslt.push(left.shift())} else {reuslt.push(right.shift())}}if (left.length) result = result.concat(left)if (right.length) result = result.concat(right)return result}function sort(arr) {let len = arr.lengthif (len < 2) return arr// 找到二分位置let midIndex = Math.floor(len/2)let left = arr.slice(0, midIndex)let right = arr.slice(midIndex, len)return merge(sort(left), sort(right)) // 递归调用}
参考:图文详解_
