目的:理解算法 深化算法
冒泡排序:
直接上动图好于文字
一个冒泡实例
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 冒泡排序(双重for循环 第一个for控制轮数 第二个for控制次数 比较的轮数为数据个数-1 比较的次数为数据个数-1) 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;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
上代码(优化1):
冒泡排序优化://每轮比较少比较一次。(每一轮都会比较出一个最大值,然后后一轮没有必要再比较了,所以没比较一轮,就少比较一次。。。) j<a.length-1-i <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script> var a=[45,67,23,88,21,6,99]; var temp=[]; var m=0;//轮数 var n=0;//一共次数 for(var i=0;i<a.length-1;i++){//这里不减1 后面轮数就+1 这是不对的 因为数组下标0开始 for(var j=0;j<a.length-1-i;j++){ //每轮比较少比较一次。(每一轮都会比较出一个最大值,然后后一轮没有必要再比较了,所以没比较一轮,就少比较一次。。。) if(a[j]>a[j+1]){//后面的大于前面的 后面再前 前面在后 从小到大 temp=a[j];//a[j]=temp; a[j]=a[j+1];//a[j+1]=a[j]; a[j+1]=temp;//a[j+1]=temp //顺序不能调换 因为a[]里面有个下标是一定从小到大的 } n++ } m++; } //document.write(a.length); document.write(a+"<br>"); document.write("轮数"+m+"<br>"); document.write("总次数"+n+"<br>"); // a1 a2 // 3 2 // temp // 2 3 // temp // 2 3 // temp 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 // 第一轮 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 // 第二轮 5次 // 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 // 第三轮 4次 // 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 // 第四轮 3次 // 21 23 6 45 67 88 99 // 21 6 23 45 67 88 99 // 21 6 23 45 67 88 99 // 第五轮 2次 // 6 21 23 45 67 88 99 // 6 21 23 45 67 88 99 // 第六轮 1次 // 6 21 23 45 67 88 99 </script> </head> <body> </body> </html>
上代码(优化2):
1 冒泡排序优化2:5轮 5+4+3+2+1=11次 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=[1,2,3,4,5,6,7,8,9]; 12 var temp=[]; 13 var m=0;//轮数 14 var n=0;//一共次数 15 //如果比较完备提前结束比较。(判断,如果本次比较没有移动任何元素,那么说明已经比较完成) 16 for(var i=0;i<a.length-1;i++){//这里不减1 后面轮数就+1 这是不对的 因为数组下标0开始 17 //开闭原则。(写在第一个for循环里,是为了,每轮比较初始化bool变量变为true。) 18 var bool=true; 19 for(var j=0;j<a.length-1-i;j++){ //每轮比较少比较一次。(每一轮都会比较出一个最大值,然后后一轮没有必要再比较了,所以没比较一轮,就少比较一次。。。) 20 if(a[j]>a[j+1]){//后面的大于前面的 后面再前 前面在后 从小到大 21 temp=a[j];//a[j]=temp; 22 a[j]=a[j+1];//a[j+1]=a[j]; 23 a[j+1]=temp;//a[j+1]=temp 24 //顺序不能调换 因为a[]里面有个下标是一定从小到大的 25 bool=false; 26 n++; 27 } 28 29 } 30 31 //bool这个变量默认值为true;如果本轮比较有一对元素相互交换位置,那么也不能跳出循环。 32 //但是,如果本轮比较没有任何元素相互交换位置,那么说明已经比较完成,可以跳出循环。 33 if(bool){ 34 break; 35 } 36 m++; 37 } 38 //document.write(a.length); 39 document.write(a+"<br>"); 40 41 document.write("总次数"+n+"<br>"); 42 document.write("轮数"+m+"<br>"); 43 // a1 a2 44 // 3 2 45 // temp 46 47 // 2 3 48 // temp 49 50 // 2 3 51 // temp 52 53 54 // 第一轮 6次 55 // 45 67 23 88 21 6 99 56 // 45 23 67 88 21 6 99 57 // 45 23 67 88 21 6 99 58 // 45 23 67 21 88 6 99 59 // 45 23 67 21 6 88 99 60 // 45 23 67 21 6 88 99 61 62 // 第二轮 6次 63 // 23 45 67 21 6 88 99 64 // 23 45 67 21 6 88 99 65 // 23 45 21 67 6 88 99 66 // 23 45 21 6 67 88 99 67 // 23 45 21 6 67 88 99 68 // 23 45 21 6 67 88 99 69 70 // 第三轮 6次 71 // 23 45 21 6 67 88 99 72 // 23 21 45 6 67 88 99 73 // 23 21 6 45 67 88 99 74 // 23 21 6 45 67 88 99 75 // 23 21 6 45 67 88 99 76 // 23 21 6 45 67 88 99 77 78 // 第四轮 6次 79 // 21 23 6 45 67 88 99 80 // 21 6 23 45 67 88 99 81 // 21 6 23 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 86 // 第五轮 6次 87 // 6 21 23 45 67 88 99 88 // 6 21 23 45 67 88 99 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次(这个第6轮即使后面已经成型了 它还是按照程序走一遍) 94 // 6 21 23 45 67 88 99 95 // 6 21 23 45 67 88 99 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 101 102 103 // 第一轮 6次 104 // 45 67 23 88 21 6 99 105 // 45 23 67 88 21 6 99 106 // 45 23 67 88 21 6 99 107 // 45 23 67 21 88 6 99 108 // 45 23 67 21 6 88 99 109 // 45 23 67 21 6 88 99 110 111 // 第二轮 5次 112 // 23 45 67 21 6 88 99 113 // 23 45 67 21 6 88 99 114 // 23 45 21 67 6 88 99 115 // 23 45 21 6 67 88 99 116 // 23 45 21 6 67 88 99 117 118 // 第三轮 4次 119 // 23 45 21 6 67 88 99 120 // 23 21 45 6 67 88 99 121 // 23 21 6 45 67 88 99 122 // 23 21 6 45 67 88 99 123 124 // 第四轮 3次 125 // 21 23 6 45 67 88 99 126 // 21 6 23 45 67 88 99 127 // 21 6 23 45 67 88 99 128 129 130 // 第五轮 2次 131 // 6 21 23 45 67 88 99 132 // 6 21 23 45 67 88 99 133 134 // 第六轮 1次 135 // 6 21 23 45 67 88 99 136 137 </script> 138 </head> 139 <body> 140 141 </body> 142 </html> 143 // 第一轮 5次 144 // 45 67 23 88 21 6 99 145 // 45 23 67 88 21 6 99 146 // 45 23 67 88 21 6 99 147 // 45 23 67 21 88 6 99 148 // 45 23 67 21 6 88 99 149 150 151 // 第二轮 4次 152 // 23 45 67 21 6 88 99 153 // 23 45 67 21 6 88 99 154 // 23 45 21 67 6 88 99 155 // 23 45 21 6 67 88 99 156 157 158 // 第三轮 3次 159 // 23 45 21 6 67 88 99 160 // 23 21 45 6 67 88 99 161 // 23 21 6 45 67 88 99 162 163 164 // 第四轮 2次 165 // 21 23 6 45 67 88 99 166 // 21 6 23 45 67 88 99 167 168 169 170 // 第五轮 1次 171 // 6 21 23 45 67 88 99 172 173 174 // 第六轮 0次