標籤:數組分割 個數 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實現排序演算法