数组排序问题:细研究这几种排序的算法,挺有意思
function swap(x,y,arr){ var temp = arr[x] arr[x] = arr[y] arr[y] = temp }
冒泡排序:比较相邻的两个项,如果第一个比第二大,则交换它们。元素项向上移动至正确的顺序。
冒泡排序升级版:如果从内循环减去外循环中已跑过的轮数,就可以避免循环中所有不必要的比较
本质上是:每循环一次内层循环,都会将当前最大的值放置arr.length-i的位置,可以看console.log(arr)的值
function bubbleSort(arr){ for(var i = 0; i < arr.length; i++){ for(var j = 0; j < arr.length-i; j++){ if(arr[j] > arr[j+1]){ swap(j,j+1,arr) } } } return arr }
选择排序:找到数据结构中最小值并将其放置第一位,接着找到第二小的值并将其放在第二位,以此类推。
个人理解:选择排序和冒泡排序是相反的两个操作,选择排序是每轮循环都将最小值放置i的位置,可以看console.log(arr)的值
function selectSort(arr){ for(var i = 0;i < arr.length-1;i++){ var minIndex = i; for(var j = i + 1;j < arr.length;j++){ if(arr[j] < arr[minIndex]){ minIndex = j } } if(arr[i] > arr[minIndex]){ swap(i,minIndex,arr) } } return arr }
插入排序:每次排一个数组项以此方式构建最后的排序数组。
function insertSort(arr){ for(var i = 1;i < arr.length;i++){ var preIndex = i-1,current = arr[i] while(preIndex >= 0 && current < arr[preIndex]){ arr[preIndex + 1] = arr[preIndex]; preIndex--; } arr[preIndex + 1] = current; } return arr }
归并排序
function mergeSort(arr){ function merge(left,right){ var leftLen = left&&left.length,rightLen = right&&right.length; var result = [] var m = 0,n = 0; while(m < leftLen && n < rightLen){ left[m] < right[n]?result.push(left[m++]):result.push(right[n++]) } while(m < leftLen){ result.push(left[m++]) } while(n < rightLen){ result.push(right[n++]) } return result } var len = arr.length if(len == 1){ return arr } var mid = Math.floor(len/2),left = arr.slice(0,mid),right = arr.slice(mid) return merge(mergeSort(left),mergeSort(right)) }
快速排序
function quickSort(arr){ if(arr.length <= 1){ return arr } var baseVal = arr.splice(0,1)[0],left = [],right = []; for(var i = 0;i < arr.length;i++){ arr[i] < baseVal?left.push(arr[i]):right.push(arr[i]) } return quickSort(left).concat([baseVal],quickSort(right)) }
计数排序升级版:使用min避免避免空间浪费
function countingSort(arr){ let min = Math.min(...arr) let max = Math.max(...arr) let initArr = new Array(max-min+1).fill(0) let result = [] for(let i = 0;i < arr.length;i++){ let item = arr[i] initArr[item-min]++ } for(let j = 0;j < initArr.length;j++){ let jItem = initArr[j] while(jItem > 0){ result.push(j+min) jItem-- } } return result }
基数排序:这个排序有点意思,根据数值的基数位的值分别排序最后得到的排序数组 暂未添加
function radixSort(sort){
}