JavaScript實現排序演算法

來源:互聯網
上載者:User

標籤:數組分割   個數   rem   func   asc   快速   合并排序   分組   gap   

// 寄生構造方式實現繼承  var MyArray=function(){    var arr=new Array();    // 添加值    arr.push.apply(arr,arguments);//和下面的迴圈一個效果    // for (var i = 0; i < arguments.length; i++) {    //   arr.push(arguments[i]);    // }  // ===========================插入排序=====================================    arr.insertSort=function(){     var position,         current;//當前待排序的元素      for (var i = 1; i < arr.length; i++) {           if (arr[i]<arr[i-1]) {              position=i;              current=arr[i];              do{                arr[position]=arr[position-1];//移動資料                position--;//空位置,用來移動資料的              }while(position>0 && arr[position-1]>current)              arr[position]=current;           }else{ //當前待排序的值>=上一個已排序的值             // 不用移動,直接進入下一個迴圈           }      }    };  // =======================希爾排序==============================  // 是基於插入排序的變種(以下說的排序都是插入排序)  // 對待排序的數組進行多次分組排序,最後在對這個數組進行整體合并排序  //   // 那麼有兩個問題:  // 1、怎麼分組  // 這裡的分組並不是真的新建立新的數組容器來將整個數組進行分組,在原數組上用一些標記來進行劃分  // 例如數組:[1,2,33,5,67,0,6]  // 我們取下標增量imcrement=3,2,1 分別對這個數組進行3次劃分,並且對這3次劃分的各個數組進行一次插入排序  // 增量為3:[1,5,6] [2,67] [33,0] ——排序——>[1,5,6] [2,67] [0,33]——新數組——>[1,2,0,5,67,33,6]  // 增量為2:[1,0,67,6] [2,5,33]  ——排序——> [1,0,6,67] [2,5,33] ——新數組——> [1,2,0,5,6,33,67]  // 增量為1:[1,2,0,5,6,33,67]   ——排序——> [0,1,2,5,6,33,67]  //   // 註:每次劃分都是在排序後的新循序進行劃分  // 這裡的排序方法和之前的插入排序稍有區別,排序的時候"移位"使用的是swap方式的數值交換,因為不能影響到其它的分組。  // 2、怎麼合并  // 這裡分組並沒有把數組分割,當使用增量為1的時候就是對整個數組進行合并排序  arr.shellSort=function(){    var increment=arr.length;    do{      increment= parseInt(increment/3)+1;//這裡的取整很重要      for (var i = 0; i <increment; i++) {          _inerSort(i,increment);      }      if (increment==1) {break;}    }while(increment>1)  };  function _inerSort(start,gap){    var tmp;    for (var i = start+gap; i < arr.length; i+=gap) {       if (arr[i]<arr[i-gap]) {          tmp=arr[i];          arr[i]=arr[i-gap];          arr[i-gap]=tmp;       }    }  }  // ================start of 選擇排序========================   function _swapFun(low,high){      var tmp=arr[low];      arr[low]=arr[high];      arr[high]=tmp;   }   function _findMax_index(low,high){    var  max_index=low;//if low==high max_index=low    for (var i = low+1; i < high+1; i++) {        if (arr[max_index]<arr[i]) {          max_index=i;        }    }    return max_index;   }   arr.selectSort=function(){         var max_key;         for (var i = arr.length-1; i >0 ; i--) {            max_key=_findMax_index(0,i);            _swapFun(max_key,i);         }   };  // ======================end of 選擇排序================================  //   // 快速排序  function _partion(low,top){      var povit=arr[low];    for (var i = low+1 ; i <top+1; i++) {         if (arr[i]<povit) {            var tmp=arr[i];             arr.splice(i,1);//這裡直接用Array類型的splice方法刪除             arr.splice(low,0,tmp)//插入povit的左側         }    }    var mid=arr.indexOf(povit);   return mid;  }  arr.quickSort=function(low,top){   if (low>=top) {console.log("low:"+low+"top:"+top+"\n");return;}   var p=_partion(low,top);     arguments.callee(low,p);     arguments.callee(p+1,top);  };    return arr;  };

 

JavaScript實現排序演算法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.