js中幾大算法,最近看到網上各路大神的解答,都蠻好的,自己也來玩一玩
一,快速排序
大致分三步:
- 在數據集之中,選擇一個元素作為"基准"(pivot)。
- 所有小於"基准"的元素,都移到"基准"的左邊;所有大於"基准"的元素,都移到"基准"的右邊。
- 對"基准"左邊和右邊的兩個子集,不斷重復第一步和第二步,直到所有子集只剩下一個元素為止。
const quickSort = (arr) => {//傳入一個數組 if ( arr.length <= 1){//如果數組長度小於等於1無需判斷直接返回即可 return arr } let pivotIndex = Math.floor( arr.length / 2)//取基准點 console.log(pivotIndex+" %%%") let pivot = arr.splice(pivotIndex,1)[0]//取基准點的值,splice(index,1)函數可以返回數組中被刪粗的那個數 console.log(pivot+ "))") let left = []//存放比基准點小的數組 let right = []//存放比基准點大的數組 for (var i = 0 ; i < arr.length ; i++ ) { //遍歷數組,進行判斷分配 if ( arr[i] < pivot) { left.push( arr[i] )//比基准點小的放在左邊數組 }else{ right.push( arr[i] )//比基准點大的放在右邊數組 } } //遞歸執行以上操作,對左右兩個數組進行操作,直到數組長蘇為《=1 console.log(left+" " +right) return quickSort(left).concat([pivot],quickSort(right))//使用遞歸,然后拼接,最好寫到紙上一步一步,就會一目了然 } console.log(quickSort([8,7,4,1,9,2,3]))//打印到控制台
二,二分查找
大致分三步:
1. 從有序數組的最中間元素開始查找,如果該元素正好是指定查找的值,則查找過程結束。否則進行下一步;
2. 如果指定要查找的元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半區域查找,然后重復第一步的操作;
3. 重復以上過程,直到找到目標元素的索引,查找成功;或者直到子數組為空,查找失敗。
優點是比較次數少,查找速度快,平均性能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查找方法適用於不經常變動而查找頻繁的有序列表。
let arr = [1,2,3,4,5,6] const binarySearch = ( item ) => {//要找的元素 let mid = null //找一個中間數,定義為空,用來存值 let low = 0 //最低位置 let hight = arr.length-1//最高位置(第一次比較接受數組的長度) let element = null //用來存放數組中間的值 while ( low <= hight) {//用循環來判斷,是否滿足low<=hight mid = Math.floor(( low+hight ) / 2 )//向下取整,獲取中間值得位置 element = arr[mid]//獲取數組中間的值 if( element < item ){//比較,如果數組中間的值小於要找的元素 low = mid + 1 //此時最低位,就是之前mid 中間值加1 }else if ( element > item ){比較,如果數組中間的值大於要找的元素 hight = mid - 1 //此時的最高位置就是mid 中間值減1 }else{ return mid //反之,進入else判斷,就證明找到了 } } return -1//防止溢出 }
console.log(binarySearch(5))
好記性不如爛筆頭,寫在紙上,一目了然