High efficiency bubble sort algorithm optimization

Disclaimer: This article is a blogger original article, please indicate the source, only for learning exchange and resource sharing. Micro-channel public number: Geeks lamps https://blog.csdn.net/zc639143029/article/details/89712453

Animated bubble sort:
Here Insert Picture Description

Manual version
// 第一轮 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
Basic Edition

Bubble Sort:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
    //(双重for循环 第一个for控制轮数 第二个for控制次数 比较的轮数为数据个数-1 一轮比较的次数为数据个数-1 总个数为比较轮数*1轮比较次数)
        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;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


// 第一轮 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
 </script>
</head>
<body>
</body>
</html>

Simple optimized version

冒泡排序优化://每轮比较少比较一次。(每一轮都会比较出一个最大值,然后后一轮没有必要再比较了,所以没比较一轮,就少比较一次。。。) 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


// 第一轮 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>

Ultimate optimized version

做一个判断
如果在比较的时候 两两不发生比较了 就退出循环 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        var a=[45,67,23,88,21,6,99];
        //var a=[3,2,1,0,6];
        //var a=[1,2,4,3,5,6,7,8,9];
        var temp=[];
        var m=0;//轮数
        var n=0;//一共次数
        //如果比较完备提前结束比较。(判断,如果本次比较没有移动任何元素,那么说明已经比较完成)
        for(var i=0;i<a.length-1;i++){//这里不减1 后面轮数就+1 这是不对的 因为数组下标0开始
             //开闭原则。(写在第一个for循环里,是为了,每轮比较初始化bool变量变为true。)
            var bool=true;
            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[]里面有个下标是一定从小到大的
                    bool=false;
                         
                }
                n++;
            }
            
            //bool这个变量默认值为true;如果本轮比较有一对元素相互交换位置,那么也不能跳出循环。
        //但是,如果本轮比较没有任何元素相互交换位置,那么说明已经比较完成,可以跳出循环。
            m++;
            if(bool){
                break;
            }
            
        }
        //document.write(a.length);
        document.write(a+"<br>");
        
        document.write("总次数"+n+"<br>");
        document.write("轮数"+m+"<br>");
        // a1  a2
        // 3    2
        // temp 

        // 2     3
        //      temp

        //  2    3   
        // temp


// 第一轮 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>

A function to allow external package to choose what kind of sort method:

var arr = [35, 2, 4, 5, 6,5,8,9,99,11];
Array.prototype.mySort = function (fn) {
        for (var i = 0; i < this.length - 1; i++) {
            var isSort = true;
            for (var j = 0; j < this.length - i - 1; j++) {
            // 封装一个函数让其外部进行选择是哪种方式排序
                if (fn(this[j], this[j + 1]) > 0) {
                    isSort = false;
                    var temp = this[j];
                    this[j] = this[j + 1];
                    this[j + 1] = temp;
                }
            }
            if (isSort) {
                break;
            }
        }
    };

 arr.mySort(function (a, b) {
        // 从小到达  return a - b;
        // 从达到小  return b-a;
    });

Added here is determined after the outer loop may be reduced
such as sorting 123
base order of 2 4
-i order of 2 3 (only rounding second cycles of the second comparison)
BOOL then determined as follows: 1 2nd round after round 2 because it was found the next round of comparisons is not comparable to exit the loop output ordering
such greatly improve efficiency.

Guess you like

Origin blog.csdn.net/zc639143029/article/details/89712453