冒泡排序是比較經典的排序方法,是一種用時間換空間的排序方法。我總結了一下它的特色:(1)它的時間複雜度是;(2)每一趟相鄰元素兩兩比較完畢就會產生最值(最大值);(3)每次比較完後下一趟就會少一個元素參與比較(即該趟比較的最大值)。
// 冒泡排序算法
function maopao(arr){ for(var i=0;i<arr.length-1;i++){ for(var j=i+1;j<arr.length;j++){ // 若是前面的大,交換位置 var temp=[]; if(arr[i]>arr[j]){ temp = arr[i]; arr[i]=arr[j]; arr[j]=temp; } } } return arr; } var arr = [1,9,3,7,2,8,3,99,44,1,6]; maopao(arr); console.log("冒泡排序"); console.log(arr);
// 2.快速排序
一趟快速排序的算法是: 數組
1)設置兩個變量i、j,排序開始的時候:i=0,j=N-1; ui
2)以第一個數組元素做爲關鍵數據,賦值給key,即 key=A[0]; 指針
3)從j開始向前搜索,即由後開始向前搜索(j=j-1即j--), 找到第一個小於key的值A[j],A[i]與A[j]交換; code
4)從i開始向後搜索,即由前開始向後搜索(i=i+1即i++), 找到第一個大於key的A[i],A[i]與A[j]交換; 排序
5)重複第三、四、5步,直到I=J; (3,4步是在程序中沒找到時候j=j-1,i=i+1,直至找到爲止。 找到並交換的時候i, j指針位置不變。另外當i=j這過程必定正好是i+或j-完成的最後令循環結束)遞歸
function quickSort(arr){ // 若是數組長度小於等於1,直接返回 if(arr.length<=1){return arr;} // 選擇一個基準 var pivotIndex = Math.floor(arr.length/2); // 將基準與原數組分離 var pivot = arr.splice(pivotIndex,1)[0]; // 定義左右兩個空數組用來存放 var left = []; var right=[]; // 循環,若是小於基準就放左邊,大於基準就放右邊 for(var i=0;i<arr.length;i++){ if(arr[i]<=pivot){ left.push(arr[i]); }else{ right.push(arr[i]); } } // 使用遞歸 return quickSort(left).concat(pivot, quickSort(right)); } var arr2 = [999,9,3,7,24,8,3,99,44,1,6]; console.log("快速排序") console.log(quickSort(arr2));
選擇排序相比冒泡排序不穩定,時間複雜度也是。選擇排序沒趟都會產生最小值,它不是相鄰元素的比較而是在該元素設置一個索引i。而後與數組的其餘元素依次比較(除了上一個索引值),直到找到小於該元素(索引j)時交換兩元素,接着繼續從i索引(此時已經不是原來的數值)值與索引j+1值比較。
// 選擇排序索引
function selectSort(arr){ var minIndex; var temp; // 循環 for(var i=0;i<arr.length-1;i++){ minIndex=i; // 找到從i開始到最後的最小的數 for(var j=i+1;j<arr.length;j++){ if( arr[j] < arr[minIndex] ) { minIndex = j; } } temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } return arr; } var arr3 = [99,9,3,7,24,8,3,99,44,1,6]; console.log(selectSort(arr3));