首页 > 代码库 > JS 冒泡排序从学到优化

JS 冒泡排序从学到优化

目的:理解算法 深化算法 

 

冒泡排序:

直接上动图好于文字

技术分享

一个冒泡实例

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次

技术分享

JS 冒泡排序从学到优化