算法问题:
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 preIndex
for(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,所以平均复杂度是nlogn
merge = 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)
};