目的:理解算法 深化算法
冒泡排序:
直接上動圖好於文字

一個冒泡實例
45,67,23,88,21,6,99
// 第一輪 6次
// 45 67 23 88 21 6 99
// 45 23 67 88 21 6 99
// 45 23 67 88 21 6 99
// 45 23 67 21 88 6 99
// 45 23 67 21 6 88 99
// 45 23 67 21 6 88 99
// 第二輪 6次
// 23 45 67 21 6 88 99
// 23 45 67 21 6 88 99
// 23 45 21 67 6 88 99
// 23 45 21 6 67 88 99
// 23 45 21 6 67 88 99
// 23 45 21 6 67 88 99
// 第三輪 6次
// 23 45 21 6 67 88 99
// 23 21 45 6 67 88 99
// 23 21 6 45 67 88 99
// 23 21 6 45 67 88 99
// 23 21 6 45 67 88 99
// 23 21 6 45 67 88 99
// 第四輪 6次
// 21 23 6 45 67 88 99
// 21 6 23 45 67 88 99
// 21 6 23 45 67 88 99
// 21 6 23 45 67 88 99
// 21 6 23 45 67 88 99
// 21 6 23 45 67 88 99
// 第五輪 6次
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 第六輪 6次(這個第6輪即使后面已經成型了 它還是按照程序走一遍)
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
// 6 21 23 45 67 88 99
上代碼(基礎型)
1 冒泡排序: 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <title>Document</title> 7 <script> 8 //(雙重for循環 第一個for控制輪數 第二個for控制次數 比較的輪數為數據個數-1 一輪比較的次數為數據個數-1 總個數為比較輪數*1輪比較次數) 9 var a=[45,67,23,88,21,6,99]; 10 var temp=[]; 11 var m=0;//輪數 12 var n=0;//一共次數 13 for(var i=0;i<a.length-1;i++){//這里不減1 后面輪數就+1 這是不對的 因為數組下標0開始 14 for(var j=0;j<a.length-1;j++){ 15 if(a[j]>a[j+1]){//后面的大於前面的 后面再前 前面在后 從小到大 16 temp=a[j];//a[j]=temp; 17 a[j]=a[j+1];//a[j+1]=a[j]; 18 a[j+1]=temp;//a[j+1]=temp 19 //順序不能調換 因為a[]里面有個下標是一定從小到大的 20 } 21 n++ 22 } 23 m++; 24 } 25 //document.write(a.length); 26 document.write(a+"<br>"); 27 document.write("輪數"+m+"<br>"); 28 document.write("總次數"+n+"<br>"); 29 // a1 a2 30 // 3 2 31 // temp 32 33 // 2 3 34 // temp 35 36 // 2 3 37 // temp 38 39 40 // 第一輪 6次 41 // 45 67 23 88 21 6 99 42 // 45 23 67 88 21 6 99 43 // 45 23 67 88 21 6 99 44 // 45 23 67 21 88 6 99 45 // 45 23 67 21 6 88 99 46 // 45 23 67 21 6 88 99 47 48 // 第二輪 6次 49 // 23 45 67 21 6 88 99 50 // 23 45 67 21 6 88 99 51 // 23 45 21 67 6 88 99 52 // 23 45 21 6 67 88 99 53 // 23 45 21 6 67 88 99 54 // 23 45 21 6 67 88 99 55 56 // 第三輪 6次 57 // 23 45 21 6 67 88 99 58 // 23 21 45 6 67 88 99 59 // 23 21 6 45 67 88 99 60 // 23 21 6 45 67 88 99 61 // 23 21 6 45 67 88 99 62 // 23 21 6 45 67 88 99 63 64 // 第四輪 6次 65 // 21 23 6 45 67 88 99 66 // 21 6 23 45 67 88 99 67 // 21 6 23 45 67 88 99 68 // 21 6 23 45 67 88 99 69 // 21 6 23 45 67 88 99 70 // 21 6 23 45 67 88 99 71 72 // 第五輪 6次 73 // 6 21 23 45 67 88 99 74 // 6 21 23 45 67 88 99 75 // 6 21 23 45 67 88 99 76 // 6 21 23 45 67 88 99 77 // 6 21 23 45 67 88 99 78 // 6 21 23 45 67 88 99 79 // 第六輪 6次(這個第6輪即使后面已經成型了 它還是按照程序走一遍) 80 // 6 21 23 45 67 88 99 81 // 6 21 23 45 67 88 99 82 // 6 21 23 45 67 88 99 83 // 6 21 23 45 67 88 99 84 // 6 21 23 45 67 88 99 85 // 6 21 23 45 67 88 99 86 87 88 </script> 89 </head> 90 <body> 91 92 </body> 93 </html>
上代碼(優化1):
1 冒泡排序優化://每輪比較少比較一次。(每一輪都會比較出一個最大值,然后后一輪沒有必要再比較了,所以沒比較一輪,就少比較一次。。。) j<a.length-1-i 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <title>Document</title> 7 <script> 8 var a=[45,67,23,88,21,6,99]; 9 var temp=[]; 10 var m=0;//輪數 11 var n=0;//一共次數 12 for(var i=0;i<a.length-1;i++){//這里不減1 后面輪數就+1 這是不對的 因為數組下標0開始 13 for(var j=0;j<a.length-1-i;j++){ //每輪比較少比較一次。(每一輪都會比較出一個最大值,然后后一輪沒有必要再比較了,所以沒比較一輪,就少比較一次。。。) 14 if(a[j]>a[j+1]){//后面的大於前面的 后面再前 前面在后 從小到大 15 temp=a[j];//a[j]=temp; 16 a[j]=a[j+1];//a[j+1]=a[j]; 17 a[j+1]=temp;//a[j+1]=temp 18 //順序不能調換 因為a[]里面有個下標是一定從小到大的 19 } 20 n++ 21 } 22 m++; 23 } 24 //document.write(a.length); 25 document.write(a+"<br>"); 26 document.write("輪數"+m+"<br>"); 27 document.write("總次數"+n+"<br>"); 28 // a1 a2 29 // 3 2 30 // temp 31 32 // 2 3 33 // temp 34 35 // 2 3 36 // temp 37 38 39 // 第一輪 6次 40 // 45 67 23 88 21 6 99 41 // 45 23 67 88 21 6 99 42 // 45 23 67 88 21 6 99 43 // 45 23 67 21 88 6 99 44 // 45 23 67 21 6 88 99 45 // 45 23 67 21 6 88 99 46 47 // 第二輪 6次 48 // 23 45 67 21 6 88 99 49 // 23 45 67 21 6 88 99 50 // 23 45 21 67 6 88 99 51 // 23 45 21 6 67 88 99 52 // 23 45 21 6 67 88 99 53 // 23 45 21 6 67 88 99 54 55 // 第三輪 6次 56 // 23 45 21 6 67 88 99 57 // 23 21 45 6 67 88 99 58 // 23 21 6 45 67 88 99 59 // 23 21 6 45 67 88 99 60 // 23 21 6 45 67 88 99 61 // 23 21 6 45 67 88 99 62 63 // 第四輪 6次 64 // 21 23 6 45 67 88 99 65 // 21 6 23 45 67 88 99 66 // 21 6 23 45 67 88 99 67 // 21 6 23 45 67 88 99 68 // 21 6 23 45 67 88 99 69 // 21 6 23 45 67 88 99 70 71 // 第五輪 6次 72 // 6 21 23 45 67 88 99 73 // 6 21 23 45 67 88 99 74 // 6 21 23 45 67 88 99 75 // 6 21 23 45 67 88 99 76 // 6 21 23 45 67 88 99 77 // 6 21 23 45 67 88 99 78 // 第六輪 6次(這個第6輪即使后面已經成型了 它還是按照程序走一遍) 79 // 6 21 23 45 67 88 99 80 // 6 21 23 45 67 88 99 81 // 6 21 23 45 67 88 99 82 // 6 21 23 45 67 88 99 83 // 6 21 23 45 67 88 99 84 // 6 21 23 45 67 88 99 85 86 87 88 // 第一輪 6次 89 // 45 67 23 88 21 6 99 90 // 45 23 67 88 21 6 99 91 // 45 23 67 88 21 6 99 92 // 45 23 67 21 88 6 99 93 // 45 23 67 21 6 88 99 94 // 45 23 67 21 6 88 99 95 96 // 第二輪 5次 97 // 23 45 67 21 6 88 99 98 // 23 45 67 21 6 88 99 99 // 23 45 21 67 6 88 99 100 // 23 45 21 6 67 88 99 101 // 23 45 21 6 67 88 99 102 103 // 第三輪 4次 104 // 23 45 21 6 67 88 99 105 // 23 21 45 6 67 88 99 106 // 23 21 6 45 67 88 99 107 // 23 21 6 45 67 88 99 108 109 // 第四輪 3次 110 // 21 23 6 45 67 88 99 111 // 21 6 23 45 67 88 99 112 // 21 6 23 45 67 88 99 113 114 115 // 第五輪 2次 116 // 6 21 23 45 67 88 99 117 // 6 21 23 45 67 88 99 118 119 // 第六輪 1次 120 // 6 21 23 45 67 88 99 121 122 </script> 123 </head> 124 <body> 125 126 </body> 127 </html>
這里的i就是為了減少比較次數的,通過紅色數字可以看出,每一輪下來,其實紅色部分是不會再進行比較的,因為他已經從大到小排了,如果是基礎版,必須得走,優化后,紅色的那部分無需再進行比較.
次數=n(n-1)/2
上代碼(優化2):
1 冒泡排序優化2 2 做一個判斷 3 如果在比較的時候 兩兩不發生比較了 就退出循環 4 <!DOCTYPE html> 5 <html lang="en"> 6 <head> 7 <meta charset="UTF-8"> 8 <title>Document</title> 9 <script> 10 var a=[45,67,23,88,21,6,99]; 11 //var a=[3,2,1,0,6]; 12 //var a=[1,2,4,3,5,6,7,8,9]; 13 var temp=[]; 14 var m=0;//輪數 15 var n=0;//一共次數 16 //如果比較完備提前結束比較。(判斷,如果本次比較沒有移動任何元素,那么說明已經比較完成) 17 for(var i=0;i<a.length-1;i++){//這里不減1 后面輪數就+1 這是不對的 因為數組下標0開始 18 //開閉原則。(寫在第一個for循環里,是為了,每輪比較初始化bool變量變為true。) 19 var bool=true; 20 for(var j=0;j<a.length-1-i;j++){ //每輪比較少比較一次。(每一輪都會比較出一個最大值,然后后一輪沒有必要再比較了,所以沒比較一輪,就少比較一次。。。) 21 if(a[j]>a[j+1]){//后面的大於前面的 后面再前 前面在后 從小到大 22 temp=a[j];//a[j]=temp; 23 a[j]=a[j+1];//a[j+1]=a[j]; 24 a[j+1]=temp;//a[j+1]=temp 25 //順序不能調換 因為a[]里面有個下標是一定從小到大的 26 bool=false; 27 28 } 29 n++; 30 } 31 32 //bool這個變量默認值為true;如果本輪比較有一對元素相互交換位置,那么也不能跳出循環。 33 //但是,如果本輪比較沒有任何元素相互交換位置,那么說明已經比較完成,可以跳出循環。 34 m++; 35 if(bool){ 36 break; 37 } 38 39 } 40 //document.write(a.length); 41 document.write(a+"<br>"); 42 43 document.write("總次數"+n+"<br>"); 44 document.write("輪數"+m+"<br>"); 45 // a1 a2 46 // 3 2 47 // temp 48 49 // 2 3 50 // temp 51 52 // 2 3 53 // temp 54 55 56 // 第一輪 6次 57 // 45 67 23 88 21 6 99 58 // 45 23 67 88 21 6 99 59 // 45 23 67 88 21 6 99 60 // 45 23 67 21 88 6 99 61 // 45 23 67 21 6 88 99 62 // 45 23 67 21 6 88 99 63 64 // 第二輪 6次 65 // 23 45 67 21 6 88 99 66 // 23 45 67 21 6 88 99 67 // 23 45 21 67 6 88 99 68 // 23 45 21 6 67 88 99 69 // 23 45 21 6 67 88 99 70 // 23 45 21 6 67 88 99 71 72 // 第三輪 6次 73 // 23 45 21 6 67 88 99 74 // 23 21 45 6 67 88 99 75 // 23 21 6 45 67 88 99 76 // 23 21 6 45 67 88 99 77 // 23 21 6 45 67 88 99 78 // 23 21 6 45 67 88 99 79 80 // 第四輪 6次 81 // 21 23 6 45 67 88 99 82 // 21 6 23 45 67 88 99 83 // 21 6 23 45 67 88 99 84 // 21 6 23 45 67 88 99 85 // 21 6 23 45 67 88 99 86 // 21 6 23 45 67 88 99 87 88 // 第五輪 6次 89 // 6 21 23 45 67 88 99 90 // 6 21 23 45 67 88 99 91 // 6 21 23 45 67 88 99 92 // 6 21 23 45 67 88 99 93 // 6 21 23 45 67 88 99 94 // 6 21 23 45 67 88 99 95 // 第六輪 6次(這個第6輪即使后面已經成型了 它還是按照程序走一遍) 96 // 6 21 23 45 67 88 99 97 // 6 21 23 45 67 88 99 98 // 6 21 23 45 67 88 99 99 // 6 21 23 45 67 88 99 100 // 6 21 23 45 67 88 99 101 // 6 21 23 45 67 88 99 102 103 104 105 // 第一輪 6次 106 // 45 67 23 88 21 6 99 107 // 45 23 67 88 21 6 99 108 // 45 23 67 88 21 6 99 109 // 45 23 67 21 88 6 99 110 // 45 23 67 21 6 88 99 111 // 45 23 67 21 6 88 99 112 113 // 第二輪 5次 114 // 23 45 67 21 6 88 99 115 // 23 45 67 21 6 88 99 116 // 23 45 21 67 6 88 99 117 // 23 45 21 6 67 88 99 118 // 23 45 21 6 67 88 99 119 120 // 第三輪 4次 121 // 23 45 21 6 67 88 99 122 // 23 21 45 6 67 88 99 123 // 23 21 6 45 67 88 99 124 // 23 21 6 45 67 88 99 125 126 // 第四輪 3次 127 // 21 23 6 45 67 88 99 128 // 21 6 23 45 67 88 99 129 // 21 6 23 45 67 88 99 130 131 132 // 第五輪 2次 133 // 6 21 23 45 67 88 99 134 // 6 21 23 45 67 88 99 135 136 // 第六輪 1次 137 // 6 21 23 45 67 88 99 138 139 </script> 140 </head> 141 <body> 142 143 </body> 144 </html>
這里加了判斷后可以減少外層循環
比如 排序123
基礎排序為2輪4次
-i排序為2輪3次(它只舍去了第二輪循環的第二次比較)
bool判斷的話為:1輪2次 因為它進行一輪2次比較后發現下一輪沒有可比較的了 直接退出循環 輸出排序

