1.比較相鄰的元素。若是第一個比第二個大,就交換他們兩個。 2.對每一對相鄰元素做一樣的工做,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。 3.針對全部的元素重複以上的步驟,除了最後一個。 4.持續每次對愈來愈少的元素重複上面的步驟,直到沒有任何一對數字須要比較。
var arr = [9,8,7,6,5,4,3,2,1,0]; //交換arr[i]和arr[j] function swap(arr,i,j){ var temp; temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } //冒泡排序 function bubbleSort(arr){ var leap = 0; if(arr.length==0) return; for(var i = 0 ; i < arr.length ; i++){ leap = 0; for(var j = 1 ; j < arr.length ; j++){ if(arr[j-1] > arr[j]){ swap(arr,j-1,j); leap = 1; } } //若是沒有交換,即排序正確,提早結束 if(leap == 0){ return; } } return arr; } console.log(bubbleSort(arr)); // arr = [0,1,2,3,4,5,6,7,8,9]
冒泡排序總的平均時間複雜度爲Q(n^2)。java
循環arr.length次,從i=0開始,第i次循環將比較獲得的最小(或最大)的數與a[i]交換位置,即每次循環拿出最值放到其應該在的位置,而且將其踢出下次循環。
//選擇排序 function selectionSort(arr){ var min; if(arr.length <= 1) return; for(var i = 0 ; i < arr.length-1 ; i++){ min=i; for(var j = i+1 ; j < arr.length ; j++) { if(arr[j] < arr[min]){ min = j; } } swap(arr,i,min); } return arr; } console.log(selectionSort(arr)); // arr = [0,1,2,3,4,5,6,7,8,9]
比較次數O(n^2),比較次數與關鍵字的初始狀態無關,總的比較次數N=(n-1)+(n-2)+...+1=n*(n-1)/2。交換次數O(n),最好狀況是,已經有序,交換0次;最壞狀況交換n-1次,逆序交換n/2次。交換次數比冒泡排序少多了算法
1.找一個數,對數組進行掃描,小於這個數的放在這個數的左側,大於它的放在數組右側 2.在對左右兩側的數組分別進行剛纔的操做,直到數組長度爲1時結束。
//快速排序 function fastSort(arr,begin,end){ //當end <= begin時結束遞歸 if(end <= begin){ return ; } var t = begin; var i = begin+1; var j = end; var v = arr[begin]; while (i <= j){ //經過選定的軸和其後一個值進行比較,如後一個值比他小則交換而且兩個同時加一而且再比較,如比他大則a[i]和a[j]進行交換而且再比較a[begin]和a[i]的值 if (arr[i] <= v){ swap(arr, t++, i++); }else if(arr[i] > v){ swap(arr, i, j--); } } fastSort(arr, begin, t-1); fastSort(arr, j+1, end); } fastSort(arr,0,arr.length-1); console.log(arr); //arr = [0,1,2,3,4,5,6,7,8,9]
此快速排序是優化過的,可否再優化之後再試試看。數組
以上代碼有部分是借鑑的,若有不足請指教^_^