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))

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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM