排序算法的JS實現
阿新 • • 發佈:2017-09-06
pan 掃描 left .com length 中間 tail 而不是 最小
排序算法是基礎算法,雖然關鍵在於算法的思想而不是語言,但還是決定借助算法可視化工具結合自己常用的語言實現一下
1.冒泡排序
基本思路:依次比較兩兩相鄰的兩個數,前面數比後面數小,不變。前面數比後面數大,交換順序。一輪下來,最後的一個數是最大的數。
外循環每增加一次,內循環減少一次。
圖形展示:
function bubbleSort(arr){ for (var i = 0; i < arr.length; i++) { for (var j = 0; j< arr.length-i-1; j++) { if(arr[j]>arr[j+1]){var temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } return arr; }
2.選擇排序
基本思路:循環數組,找出最小的值,和第一個交換位置;然後在剩下的數中,找出第二小的數,放在第二個;依次類推。
圖形展示:
function selectSort(arr){ for( var i=0;i<arr.length-1;i++){ var min=i; for(var j=i+1;j<arr.length;j++){ if(arr[j]<arr[min]){ min=j; } if(i!=min){ var temp=arr[i]; arr[i]=arr[min]; arr[min]=temp; } } } return arr; }
3.插入排序
基本思路:把數組分為[已排序]和[未排序]兩部分,第一個數為[已排序],其余為[未排序];
從[未排序]中抽出一個數,和[已排序]部分比較,插入到合適位置。
圖形展示:
function insert(arr){for(var i=0;i<arr.length;i++){ var value=arr[i]; //i表示未排序部分的當前位置,value表示當前比較的元素 for(var j=i-1;j>=0&&value<arr[j];j--){ //j表示已排序部分的當前位置 arr[j+1]=arr[j]; } arr[j+1]=value; } return arr; }
4、合並排序
基本思路:不斷的將數組對半分,只到每個數組只有一個元素;
將分出來的部分重新合並,合並的時候按順序排列。
圖形展示:
方法一
function mergeSort(arr){ if(arr.length<2){ return arr; } var middle=Math.floor(arr.length/2), left=arr.slice(0,middle), right=arr.slice(middle); return merge(mergeSort(left),mergeSort(right)); } function merge(left,right){ var result=[]; while(left.length>0 && right.length>0){ if(left[0]<=right[0]){ result.push(left.shift()); }else{ result.push(right.shift()); } } // while(left.length){ // result.push(left.shift()); // } // while(right.length){ // result.push(right.shift()); // } if(left.length){ result=result.concat(left); } if(right.length){ result=result.concat(right) } return result; }
方法二
function mergeSort(arr){ //只有一個數的時候退出遞歸 if(arr.length<2){ return arr; } //遞歸 var middle=Math.floor(arr.length/2), left=arr.slice(0,middle), right=arr.slice(middle); return merge(mergeSort(left),mergeSort(right)) } //將兩個數組合並;合並的時候按從小到大的順序 function merge(left,right){ var left_index=0, right_index=0, result=[]; while(left_index<left.length&&right_index<right.length){ if(left[left_index]<right[right_index]){ result.push(left[left_index++]); }else{ result.push(right[right_index++]); } } return result.concat(left.slice(left_index),right.slice(right_index));
5.快速排序
基本思路:以一個數為基準,比基準小的數放到左邊,比基準大的值放右邊;遞歸進行,不能再分後退出遞歸
圖形展示:
方法一:以中間值為基準,這種方法創建了兩個新數組,暫用空間
function quickSort(arr){ if(arr.length<2){ return arr; } var base=Math.floor(arr.length/2); var pirot=arr.splice(base,1)[0]; //基準值 var left=[], right=[]; for(var i=0;i<arr.length;i++){ if(arr[i]<pirot){ left.push(arr[i]); }else{ right.push(arr[i]); } } // 遞歸,把數組合並在一起把數組合並在一起 return quickSort(left).concat([pirot],quickSort(right)); }
方法二,以第一個值為基準,先向從右往左,找比它小的值;再從左向右找比它大的值
var quickSort = function(arr, head, tail) { if (head > tail) { return; } var i=head; var j=tail; var Pivot=arr[i]; /**< 選取基準值 */ while (i<j) { //使用j,從序列最右端開始掃描,直到遇到比基準值小的數 while ((i<j) && (Pivot <= arr[j])) { j--; } //交換位置 if (i<j) { arr[i++]=arr[j]; } //使用i,從序列最左端開始掃描,直到遇到比基準值大的數 while ( (i<j) && (Pivot >=arr[i]) ) { i++; } //交換位置 if (i<j) { arr[j--]=arr[i]; } } //最後填入基準值放入合適的位置 arr[j]=Pivot; //對基準值兩邊序列進行排序的遞歸調用 quickSort(arr, head, i-1); quickSort(arr, i+1, tail); return arr; }
排序算法的JS實現