冒泡排序
它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。
這個算法的名字由來是因為越大的元素會經由交換慢慢“浮”到數列的頂端,故名。
原理:
-
比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
-
對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。在這一點,最后的元素應該會是最大的數。
-
針對所有的元素重復以上的步驟,除了最后一個。
-
持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較
js實現:
1 var flag = false; 2 var x = 0;//計算轉換的次數 3 var arr = [35,88,16,27,32,4,90,56,79]; 4 for(var j = 0;j<arr.length-1;j++){ 5 //大的排序次數(arr.length-1) 6 // 為什么要arr.length-1。假如是9個數,第一趟就把最大的數固定了,第二趟就把第二大的數固定了, 7 //每排一趟就固定了一個大數,第八趟就固定了第 八大的數,9個數8個位置都已經定下來了,那么剩下的數就是最小的數(第九大的數), 8 //所以就不用再排了,9個數,只需要排8趟,n個數,只需n-1趟 9 for(var i = 0;i<arr.length-1;i++){ 10 //小的排序,不停兩兩交換, 11 //為什么要減i,因為每定義一個大數,后面的兩兩交換循環就減少一次。 12 //假設為9個數,如第一趟,i=0,兩兩循環的次數為arr.length-1,8次;第二趟,i=1, 13 //兩兩交換循環的次數就為arr.length-1,7次,因為已經把最大的數固定了,就相當於剩下的8個數參與排序,7次兩兩交換。 14 15 if(arr[i]>arr[i+1]){//相鄰連個數進行比較,如果第一個數大於第二個數則互換位置。 16 t = arr[i + 1]; 17 arr[i+1] = arr[i]; 18 arr[i] = t; 19 flag = true; 20 } 21 } 22 if(flag){ 23 x++; 24 flag = false;//如果為true則表示交換了位置,如果為false則表示順序是對的,不需要排序了,可以減少循環的次數 25 } 26 else{ 27 break; 28 } 29 } 30 alert(x);//五次 31 document.write(arr + "<br/>");