常見的幾種數組排序算法JS實現


常見的幾種數組排序算法JS實現

網上找到一些算法思想,然后自己用JS表現出來(小菜一只,大神勿噴)
思想到是很簡單,打代碼,調試代碼,細節可以讓人抓狂,好了不說了,下面是我的勞動成果

常見的排序算法思想

快速排序

 從給定的數據中,隨機抽出一項,這項的左邊放所有比它小的,右邊放比它大的,然后再分別這兩邊執行上述操作,采用的是遞歸的思想,總結出來就是 實現一層,分別給兩邊遞歸,設置好出口

function fastSort(array,head,tail){
    //考慮到給每個分區操作的時候都是在原有的數組中進行操作的,所以這里head,tail來確定分片的位置
    /*生成隨機項*/
    var randomnum = Math.floor(ranDom(head,tail));
    var random = array[randomnum];
    /*將小於random的項放置在其左邊  策略就是通過一個臨時的數組來儲存分好區的結果,再到原數組中替換*/
    var arrayTemp = [];
    var unshiftHead = 0;
    for(var i = head;i <= tail;i++){
      if(array[i]<random){
        arrayTemp.unshift(array[i]);
        unshiftHead++;
      }else if(array[i]>random){
        arrayTemp.push(array[i]);
      }
      /*當它等於的時候放哪,這里我想選擇放到隊列的前面,也就是從unshift后的第一個位置放置*/
      if(array[i]===random){
        arrayTemp.splice(unshiftHead,0,array[i]);
      }
    }
    /*將對應項覆蓋原來的記錄*/
    for(var j = head , u=0;j <= tail;j++,u++){
      array.splice(j,1,arrayTemp[u]);
    }
    /*尋找中間項所在的index*/
    var nowIndex = array.indexOf(random);

    /*設置出口,當要放進去的片段只有2項的時候就可以收工了*/
    if(arrayTemp.length <= 2){
      return;
    }
    /*遞歸,同時應用其左右兩個區域*/
    fastSort(array,head,nowIndex);
    fastSort(array,nowIndex+1,tail);
  }

插入排序

思想就是在已經排好序的數組中插入到相應的位置,以從小到大排序為例,掃描已經排好序的片段的每一項,如大於,則繼續往后,直到他小於一項時,將其插入到這項的前面

function insertSort(array){
    /*start根據已排列好的項數決定*/
    var start=1;
    /*按順序,每一項檢查已排列好的序列*/
    for(var i=start; i<array.length; start++,i++){
      /*跟已排好序的序列做對比,並插入到合適的位置*/
      for(var j=0; j<start; j++){
        /*小於或者等於時(我們是升序)插入到該項前面*/
        if(array[i]<=array[j]){
          console.log(array[i]+' '+array[j]);
          array.splice(j,0,array[i]);
          /*刪除原有項*/
          array.splice(i+1,1);
          break;
        }
      }

    }
  }

冒泡排序

故名思意 ,就是一個個冒泡到最前端或者最后端,主要是通過兩兩依次比較,以升序為例,如果前一項比后一項大則交換順序,一直比到最后一對

function bubbleSort(array){
    /*給每個未確定的位置做循環*/
    for(var unfix=array.length-1; unfix>0; unfix--){
      /*給進度做個記錄,比到未確定位置*/
      for(var i=0; i<unfix;i++){
        if(array[i]>array[i+1]){
          var temp = array[i];
          array.splice(i,1,array[i+1]);
          array.splice(i+1,1,temp);
        }
      }
    }
  }

選擇排序

將當前未確定塊的min或者max取出來插到最前面或者后面

function selectSort(array){
    /*給每個插入后的未確定的范圍循環,初始是從0開始*/
    for(var unfixed=0; unfixed<array.length; unfixed++){
      /*設置當前范圍的最小值和其索引*/
      var min = array[unfixed];
      var minIndex = unfixed;
      /*在該范圍內選出最小值*/
      for(var j=unfixed+1; j<array.length; j++){
        if(min>array[j]){
          min = array[j];
          minIndex = j;
        }
      }
      /*將最小值插入到unfixed,並且把它所在的原有項替換成*/
      array.splice(unfixed,0,min);
      array.splice(minIndex+1,1);
    }
  }

總結一下,實現思想是很簡單的,難點在於如何創造思想,還有就是個人的測試能力,和編程習慣,做注釋其實不是僅僅為了別人看得更方便,而是自己思路的記錄,有些人編着編着容易斷片,注釋起到了很好的引導作用


免責聲明!

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



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