js實現快速排序,二分查詢 (詳解,一次學會)
阿新 • • 發佈:2018-11-14
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))
好記性不如爛筆頭,寫在紙上,一目瞭然