常用演算法js用法(插入 ,快排,歸併)
阿新 • • 發佈:2018-12-21
/** * 插入演算法 * 從第2個元素開始如果比上一個元素小,上面的元素位置都往後挪移位,該元素放在最前面 * */ function insertSort(numArr) { for(let i=1; i<numArr.length; ++i){ if(numArr[i] < numArr[i-1]){ let temp = numArr[i]; let j = i; while (j > 0 && numArr[j - 1] >= temp){ numArr[j] = numArr[j-1] j--; } numArr[j] = temp; } } } /** * 快排 * 以一個元素為基準分成比他大和小的兩個部分,將這個元素放中間,遞迴下去 * */ function quickSort(array){ function swap(array,i,j) { let temp = array[i]; array[i] = array[j]; array[j] = temp; } function segmentation(array,left,right) { let index = left; let temp = array[right]; for(let i = left; i < right; ++i){ if(array[i] < temp){ swap(array,index,i); index++; } } swap(array,right,index); return index; } function sort(array,left,right) { if(left > right){ return; } console.log('before:',array); let index = segmentation(array,left,right); console.log('after:',array); sort(array,left,index - 1); sort(array,index + 1, right); } sort(array, 0, array.length - 1); return array; } // let testArr = [1,2,6,7,8,9,4,3]; // console.log(mergeSort(testArr)); /** * 歸併 * 將陣列一直查分下去,然後組合排序 * */ function mergeSort(array) { function swap(array,i,j) { let temp = array[j]; let k = j; while (k > i) { array[k] = array[k-1]; k--; } array[i] = temp; } function split(array,startIndex,endIndex) { if(startIndex < endIndex){ let midIndex = startIndex + Math.floor((endIndex - startIndex)/2); split(array,startIndex,midIndex); split(array,midIndex+1,endIndex); merge(array,startIndex,midIndex,endIndex); } } function merge(array,startIndex,midIndex,endIndex) { let i = startIndex; let j = midIndex + 1; let k = 0; let temp = []; while (i < midIndex + 1 && j < endIndex + 1){ if(array[i] < array[j]){ temp[k++] = array[i++]; } else{ temp[k++] = array[j++]; } } while (i != midIndex + 1){ temp[k++] = array[i++]; } while (j != endIndex + 1){ temp[k++] = array[j++]; } temp.forEach((tmp,index)=>{ array[startIndex+index] = tmp; }); } split(array,0,array.length - 1); return array; }