算法问题:
sort
递归
一分为二,分冶
//冒泡排序bubbleSort = function(arr){const length = arr.length;let hasChanged = true;for(let i=0;i<length &&hasChanged;i++){for(let j= 0;j<length -1-i;j++){if(arr[j]>arr[j+1]){[arr[j],arr[j+1]] = [arr[j+1],arr[j]];hasChanged = true;}}}console.log(arr);};//插入排序insertSort = function(arr){let l = arr.length;let current;let preIndexfor(let i=1;i<length;i++){//外层循环current = arr[i];preIndex = i-1;//内层循环,判断插入到哪里// 内循环结束,j+1 所指向的位置就是 current 值插入的位置while(preIndex>= 0 && arr[preIndex] > current){arr[preIndex+1] =arr[preIndex];preIndex --;}if(preIndex+1!==i){arr[preIndex+1] = current;}}console.log(arr);};selectionSort = function(arr){let minIndex = 0,temp;for(let i=0;i<arr.length;i++){minIndex = i;for(let j=i+1;j<arr.length;j++){if(arr[j] < arr[minIndex]){minIndex = j;}}temp = arr[i];arr[i] = arr[minIndex]arr[minIndex] = temp;}return arr;};//归并排序,先递归分为两部分,然后执行合并操作,递归时间复杂度是logn,合并操作是n,所以平均复杂度是nlognmerge = function(left,right){const result = [];while(left.length && right.length){if(left[0]<=right[0]){result.push(left.shift());} else{result.push(right.shift());}}while(left.length){result.push(left.shift());}while(right.length){result.push(right.shift());}return result;};mergeSort = function(arr){if(arr.length<2){return arr;}let mid = Math.floor(arr.length/2);let left = arr.slice(0,mid);let right = arr.slice(mid);return merge(mergeSort(left),mergeSort(right)) ;};//快排quickSort = function(arr){if (arr.length <= 1) {return arr;}let midIndex = Math.floor(arr.length/2);const mid = arr[midIndex];const left = [];const right = [];for(let i=0;i<arr.length;i++){if(arr[i]<mid){left.push(arr[i]);}else{right.push(arr[i]);}}return quickSort(left).concat(mid).quickSort(right)};
