整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          JavaScript桶排序算法詳解

          、桶排序算法

          桶排序(Bucket sort)箱排序,是一個排序算法,工作的原理是將數組分到幾個桶里,桶的數量可由排序數組最大值與最小值關系決定,可以固定幾個桶。每個桶內再通過插入、冒泡或簡單方式進行排序。其算法復雜度接近于:O(N)

          步驟是:

          1. 找到待排序中最大和最小的元素;

          2. 得到桶的數量,比如最大減去最小再除以最小值;

          3. 新建一個桶列表,然后遍歷數組,再將數組項除以桶的個數得到要存放的桶的下標,將數組項存入到對應桶中;

          4. 存入到桶中時,按順序插入,保持順序;

          5. 數據全部放入桶之后,再遍歷桶列表,將二維數組按順序展開取出即可。

          二、計數排序算法執行過程分析:

          三、桶排序代碼JS簡版

          output: [3, 3, 3.2, 4.3, 10, 15]

          四、桶排序標準版,支持負數

          output: [-7, -2.1, 3, 3, 3.2, 4.3, 10, 15]

          五、總結

          計數排序(Counting sort)、基數排序(radix sorting)和桶排序(Bucket Sort)是很類似的排序方式,都是非比較型的排序算法。

          計數排序從最最小到最大值建立全部長度數組,然后挨個放里面放入,這對于數據范圍很大的數組,需要大量時間和內存,適用性不高。

          基數排序是統一為同樣的數字長度,數字較短的數前面補零,也就是將數字拆分為個位十位百位。然后從最低位開始,依次進行一次排序?;鶖蹬判蚴蔷€性復雜度,即對n個數字處理了n次,代價較高。

          桶排序將數組分到有限數量的桶子里,然后對每個桶子再分別進行排序,不需要過多的桶。對于大量數組,可以先采用桶排序分拆,再用其他排序算法來進行桶內排序。

          擇排序概述

          選擇排序(Selection Sort)是從待排序數列中取出最小(或最大)的1位,與第一個位置交換,再從待排序數列中找出最小的跟整個數列的第二個交換。以此類推遍歷完待排序數列。平均算法復雜度:O(n^2)

          步驟是:

          1. 先建立兩個循環,外循環用于逐個交換數據,內循環用來遍歷找到最小(或最大)值。
          2. 設第1項為最小值,在內循環中將其逐個與后項進行比較,如果遇到更小的值,則更新最小值,并記錄下最小值的下標。
          3. 在外循環中將第1項與最小值進行交換,然后以第2項作為最小值,再重復執行步驟2,直到遍歷完全部待排序區間。

          選擇排序執行過程分析

          例如數列: 4, 1, 3, 5, 2

          從待排序區間中每次找到最小的項目,將其與第一項交換。

          選擇排序過程

          選擇排序實現

          • 標準實現

          選擇排序的標準實現

          • 新建數組法與移除法,這種方式會多建立一個數組,但無需交換。

          選擇排序新建數組

          . 冒泡排序

          程序員啟蒙排序算法 基礎中的基礎

          思想:

          1. 先建立一個外部循環為總比較次數 再寫一個內循環為兩兩比較的次數
          2. 第一個內循環結束應將數組中最大的數排在了數組的最右邊
          3. 經過arr.length-1次循環 數組中的元素按照從小到大的順序排列

            var arr = [3, 4, 15,80,7, 2, 6, 5, 8, 9, 10, 16, 13]; // length = 13
                 
                  function bubbleSort(arr){
                      //因為冒泡排序算法是兩兩比較 所以外層比較次數應為數組長度-1
                      for(var i = 0; i<arr.length - 1; i++){
                      //  內循環的比較不必全部執行完  因為每一輪的內循環都會將最大的數排在最右
                      //  所以后面的次數不用比較 所以內循環的次數是遞減的 需要減去一個i
                           for(var j = 0; j < arr.length -1 - i; j++){
                               if(arr[j] > arr[j+1]){
                                   var t = arr[j];
                                   arr[j] = arr[j+1];
                                   arr[j+1] = t;
                               }
                              }
                               console.log(arr)
                          }
                          return arr;
                  }
                  console.log(bubbleSort(arr));

          我自己是一名從事了多年開發的web前端老程序員,目前辭職在做自己的web前端私人定制課程,今年年初我花了一個月整理了一份最適合2019年學習的web前端學習干貨,各種框架都有整理,送給每一位前端小伙伴,想要獲取的可以關注我的頭條號并在后臺私信我:前端,即可免費獲取。

          2. 插入排序

          思想:

          1.從第一個元素開始,該元素可以認為已經被排序;

          2.取出當前元素的后一個元素,在已經排序的元素序列中從后向前循環一遍;

          3.如果該元素(已排序的元素)大于新元素,將該元素移到下一位置;

          4.重復步驟3,直到找到已排序的元素小于或者等于新元素的位置;

          5.將新元素插入到該位置后;

          6.重復步驟2~5。

          var arr = [3, 4, 15, 80, 2, 7, 6, 5, 8, 9, 10, 16, 13]; // length = 13
          
                  function insertSort(arr) {
                      var current, preIndex;
                      var len = arr.length;
                      for (var i = 1; i < len; i++) {
                      //當前元素的前一個元素下標
                          preIndex = i - 1;
                      // 將需要排序的元素用current保存起來以免因下面下標變化而取錯值
                          current = arr[i];
                      // 開始內部循環將第一個值開始排序 終止條件為當前元素下標大于數組的第0位并且當前元素大于前一個元素    否則的話將前一個元素賦值給當前元素(arr[preIndex+1])
                      //然后將前一個元素下標-1 繼續向前比較
                          while (preIndex >= 0 && current < arr[preIndex]) {
                              arr[preIndex + 1] = arr[preIndex];
                              preIndex--;
                          }
                      // 當current大于前一個元素時 把保存起來的current賦值給arr[preIndex] 
                          arr[preIndex + 1] = current;
          
                      }
                      return arr;
                  }
                  console.log(insertSort(arr));

          3.快速排序

          思想:

          1. 創建兩個數組left right
          2. 取一個基準值可以數組中任一元素 下面取了數組的中間元素并且從數組中剝離出來
          3. 將數組中的元素與基準值比較 小于基準值的放進左邊 left數組 大于基準值的放進右邊right數組
          4. 重復 步驟2 3
          var arr = [3, 4, 2, 6, 5, 8, 9, 10, 16, 13]; // length = 10
                  function quickSort(arr) {
                      if (arr.length <= 1) { return arr; }
                      //     基準值
                      var pivot = arr[Math.floor(arr.length / 2)];
                      arr.splice(arr.indexOf(pivot), 1);
                      var left = [];
                      var right = [];
                      for (var i = 0; i < arr.length; i++) {
          
                          if (arr[i] < pivot) {
                              left.push(arr[i]);
                          } else {
                              right.push(arr[i]);
                          }
          
                      }
                      return quickSort(left).concat([pivot], quickSort(right));
          
                  }
          
                  console.log(quickSort(arr));

          4.選擇排序

          思想:
          1.遍歷數組,設置最小值的索引為 0,
          2.如果取出的值比當前最小值小,就替換最小值索引,遍歷完成后,將第一個元素和最小值索引上的值交換。
          3.如上操作后,第一個元素就是數組中的最小值,下次遍歷就可以從索引 1 開始重復上述操作。

          function selectionSort(arr) {
            var len = arr.length;
            var minIndex, temp;
            for (var i = 0; i < len - 1; i++) {
              minIndex = i;
              for (var j = i + 1; j < len; j++) {
                if (arr[j] < arr[minIndex]) { //尋找最小的數
                  minIndex = j; //將最小數的索引保存
                }
              }
              temp = arr[i];
              arr[i] = arr[minIndex];
              arr[minIndex] = temp;
            }
            return arr;
          }
          var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
          console.log(selectionSort(arr));
          //[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50];


          原文鏈接:https://blog.csdn.net/weixin_42989966/article/details/103564643

          作者:唐宋丶元明清


          主站蜘蛛池模板: 久久一区不卡中文字幕| 国产精品视频一区二区三区经| 国产吧一区在线视频| 韩国一区二区三区视频| 亚洲午夜日韩高清一区| 国产一区在线电影| 人妻无码视频一区二区三区| 亚洲av无码一区二区三区在线播放 | 无码AV动漫精品一区二区免费| 人妻AV中文字幕一区二区三区| 亚洲国产一区视频| 久久青青草原一区二区| 国产一区二区三区乱码在线观看| 全国精品一区二区在线观看| 亚洲国产成人久久一区久久| 精品久久一区二区| 黄桃AV无码免费一区二区三区 | 欧亚精品一区三区免费| 日韩一区二区三区无码影院| 国产一区二区高清在线播放| 国产成人av一区二区三区在线 | 亚洲av日韩综合一区在线观看| 精品欧洲av无码一区二区三区| 国产精品熟女视频一区二区 | 精品一区二区三区在线观看视频| 日韩高清一区二区| 国产麻豆精品一区二区三区v视界| 中文字幕在线不卡一区二区 | 国产日韩一区二区三区在线观看| 成人精品一区二区户外勾搭野战| 偷拍精品视频一区二区三区| 国产福利视频一区二区| 国产精品视频一区国模私拍| 国产成人无码AV一区二区在线观看| 一本大道在线无码一区| 国产av熟女一区二区三区| 波多野结衣AV一区二区三区中文| 国产电影一区二区| 深田咏美AV一区二区三区| 亚洲日韩AV无码一区二区三区人| 中文字幕AV一区二区三区 |