整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          JavaScript常見的三種排序算法,手把手解釋代

          JavaScript常見的三種排序算法,手把手解釋代碼



          泡排序

          冒泡排序的實(shí)質(zhì)就是將數(shù)組的相鄰項(xiàng)進(jìn)行比對(duì),如果前一個(gè)比后一個(gè)大,就交換位置。

          冒泡排序需要兩層的循環(huán),第一層循環(huán)負(fù)責(zé)比對(duì)的輪次,第二層負(fù)責(zé)相鄰位置對(duì)比的次數(shù)。

          比如一個(gè)最壞情況的數(shù)組為 arr=[4,3,2,1],按照從小到大排序:

          1. 第一輪交換的過程依次為:[3,4,2,1]、[3,2,4,1]、[3,2,1,4]
          2. 第二輪交換的過程依次為:[2,3,1,4]、[2,1,3,4]
          3. 第三輪交換的過程依次為:[1,2,3,4]

          可以發(fā)現(xiàn)一個(gè)規(guī)律,比較次數(shù)+當(dāng)次輪數(shù)=數(shù)組的長(zhǎng)度

          代碼如下:

          function bubbleSort (arr){
          	let length=arr.length
            for(let i=0 ; i<length ; i++){
            	for(let j=0 ; j<arr.length - i -1 ; j++ ){
                   if(arr[j] > arr[j+1]){
                       temp=arr[j]
                       arr[j]=arr[j+1]
                       arr[j+1]=temp 
                   }
               }
            }  
            return arr
          }

          冒泡排序的比較次數(shù)可以依次推倒為:

          • 比如4個(gè)數(shù)字的排序,第一輪比較3次,第二輪比較2次,第三輪比較1次
          • 比較總次數(shù)為:3+2+1
          • n個(gè)數(shù)字,比較次數(shù)為 (n-1)+(n-2)+ …… + 1=n*(n-1)/2
          • 去除常項(xiàng)只保留最高階項(xiàng)
          • 比較次數(shù)為:O( n2 )

          冒泡排序的交換次數(shù):

          • 假定兩次比較會(huì)交換一次,取一個(gè)平均值,為n*(n-1)/2 /2
          • 去除常項(xiàng)只保留最高階項(xiàng)
          • 交換次數(shù)為:O( n2 )

          選擇排序

          選擇排序的實(shí)質(zhì):

          第一步,設(shè)置一個(gè)min最小索引值,一般從0開始

          第二步,arr[min]和未排序項(xiàng)進(jìn)行比對(duì),把比arr[min]小的項(xiàng)的索引值,改為新的最小索引值

          第三步,將新的最小索引值的位置和未排序的起始位置進(jìn)行交換,重復(fù)以上過程

          function selectionSort(arr){
          		let temp , min=0
              for( let j=0 ; j< arr.length ; i++){
              		for( let i=min + 1 ; i < arr.length ; i++ ){
              		if( arr[min] > arr[i] ){
                  		min=i
                  }
           	   }
            	temp=arr[min]
            	arr[min]=arr[0]
            	arr[0]=temp
              }
          }

          選擇排序的比較次數(shù)O(n2)

          選擇排序的交換次數(shù)O(n)



          插入排序

          插入排序就像在打撲克牌,歡樂斗地主,按照從小到到從左到右的順序?qū)⑴七M(jìn)行排列。

          在一個(gè)無序的序列中,先把第一個(gè)元素當(dāng)做已排序序列,剩余當(dāng)做未排序序列。

          然后遍歷未排序的序列,依次和第一個(gè)元素進(jìn)行比對(duì)。如果元素較小,就將其移至前方。這里可以使用while循環(huán)。

          function insertSort(arr){
             for(let i=1;i<arr.length;i++){
                  // temp是未排序中的元素
                  let temp=arr[i]
                  let j=i
                  while(temp < arr[j-1] && j>0){
                       arr[j]=arr[j-1]
                        j--
                  }
                  arr[j]=temp
             }
             return arr
          }

          插入排序最多的比較次數(shù)為:(1+2+...+N-1)/2=N*(N-1)/4

          插入排序的復(fù)制次數(shù):N*(N-1)/4

          時(shí)間復(fù)雜度為O(n2)

          格(行)排序:

          <html>
          <head>
          <meta charset="utf-8">
          <title>無標(biāo)題文檔</title>
          <script>
          window.onload=function (){
              var oTab=document.getElementById('tab1');
              var oBtn=document.getElementById('btn1');
          
              oBtn.onclick=function (){
              var arr=[];
          
              for(var i=0;i<oTab.tBodies[0].rows.length;i++){
              arr[i]=oTab.tBodies[0].rows[i]; //將表格行元素集合轉(zhuǎn)換為數(shù)組
              }
          
              arr.sort(function (tr1, tr2){ //自定義排序函數(shù)
              var n1=parseInt(tr1.cells[0].innerHTML);
              var n2=parseInt(tr2.cells[0].innerHTML);
          
              return n1-n2;
              });
          
              for(var i=0;i<arr.length;i++){
              oTab.tBodies[0].appendChild(arr[i]);
              }
              };
          };
          </script>
          </head>
          <body>
          <input id="btn1" type="button" value="排序" />
          <table id="tab1" border="1" width="500">
          <thead>
          <td>ID</td>
          <td>姓名</td>
          <td>年齡</td>
          <td>操作</td>
          </thead>
          <tbody>
          <tr>
          <td>2</td>
          <td>張三</td>
          <td>23</td>
          <td></td>
          </tr>
          <tr>
          <td>6</td>
          <td>王四</td>
          <td>24</td>
          <td></td>
          </tr>
          <tr>
          <td>1</td>
          <td>Blue</td>
          <td>27</td>
          <td></td>
          </tr>
          <tr>
          <td>5</td>
          <td>張偉</td>
          <td>24</td>
          <td></td>
          </tr>
          <tr>
          <td>3</td>
          <td>李四</td>
          <td>28</td>
          <td></td>
          </tr>
          <tr>
          <td>4</td>
          <td>王五</td>
          <td>25</td>
          <td></td>
          </tr>
          </tbody>
          </table>
          </body>
          </html>

          appendChild()方法理解:

          target.appendChild(newnode)

          1.先把元素從原有父級(jí)上刪掉

          2.添加到新的父級(jí)

          .冒泡排序:

          比較相鄰的兩個(gè)數(shù),如果前一個(gè)數(shù)大于后一個(gè)數(shù),就將這兩個(gè)數(shù)換位置。每一次遍歷都會(huì)將本次遍歷最大的數(shù)冒泡到最后。為了將n個(gè)數(shù)排好序,需要n-1次遍歷。 如果某次遍歷中,沒有調(diào)整任何兩個(gè)相鄰的數(shù)的位置關(guān)系,說明此時(shí)數(shù)組已排好序,可以結(jié)束程序。

          1. Array.prototype.bubbleSort=function () {
          2. let i, j;
          3. for (i=1; i < this.length; i++) { //表示本次是第i次遍歷
          4. let changed=false;
          5. for (j=0; j < this.length - i; j++) { //訪問序列為arr[0:length-i]
          6. if(this[j] > this[j + 1]){ //發(fā)現(xiàn)前一個(gè)數(shù)大于后一個(gè)時(shí),互換位置
          7. [this[j],this[j+1]]=[this[j+1],this[j]];
          8. changed=true;
          9. }
          10. }
          11. if(!changed) { //如果本輪遍歷沒有發(fā)現(xiàn)位置調(diào)整,結(jié)束排序函數(shù)
          12. break;
          13. }
          14. }
          15. };
          16. let arr=[43, 21, 10, 5, 9, 15, 32, 57, 35];
          17. arr.bubbleSort();
          18. console.log(arr);

          主站蜘蛛池模板: 3d动漫精品啪啪一区二区中| 国产亚洲无线码一区二区| 人妻体内射精一区二区三四| 伊人久久精品无码av一区| 国精产品999一区二区三区有限| 国产一区二区三精品久久久无广告| 国产精品视频一区国模私拍| 在线观看午夜亚洲一区| 国产成人无码AV一区二区在线观看| 日韩在线一区视频| 亚洲av乱码一区二区三区| 午夜视频久久久久一区| 亚洲中文字幕久久久一区| 综合久久久久久中文字幕亚洲国产国产综合一区首| 亚洲不卡av不卡一区二区| 福利视频一区二区牛牛| 精品国产亚洲一区二区三区在线观看 | 精品女同一区二区| 亚洲熟妇av一区| 秋霞无码一区二区| 3D动漫精品啪啪一区二区下载| 中文字幕一区二区在线播放| 美女视频免费看一区二区| 相泽南亚洲一区二区在线播放| 国产一区二区好的精华液 | 日韩一区二区精品观看| 国产精品日韩一区二区三区| 精品一区高潮喷吹在线播放| 精品无码国产一区二区三区AV| 国产亚洲一区二区三区在线不卡| 人成精品视频三区二区一区| 亚洲国产激情一区二区三区 | 无码人妻aⅴ一区二区三区| 国产乱人伦精品一区二区在线观看| 精品国产一区二区三区不卡| 人妻av综合天堂一区| 色欲AV无码一区二区三区| 国产在线视频一区二区三区98| 精品乱子伦一区二区三区 | 一区二区三区日韩精品| 精品国产乱码一区二区三区|