1. 程式人生 > >js實現快速排序,二分查詢 (詳解,一次學會)

js實現快速排序,二分查詢 (詳解,一次學會)

js中幾大演算法,最近看到網上各路大神的解答,都蠻好的,自己也來玩一玩

一,快速排序

大致分三步:

  1. 在資料集之中,選擇一個元素作為"基準"(pivot)。
  2. 所有小於"基準"的元素,都移到"基準"的左邊;所有大於"基準"的元素,都移到"基準"的右邊。
  3. 對"基準"左邊和右邊的兩個子集,不斷重複第一步和第二步,直到所有子集只剩下一個元素為止。
            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))

好記性不如爛筆頭,寫在紙上,一目瞭然