JavaScript 冒泡排序及其优化

  冒泡排序是对于前端工程师来说是一种基础的算法,这种算法在执行的过程中,因为会将前后项不断比较,就像是空气从水中不断浮现的过程,所以被称之为冒泡排序.

  冒泡排序一般整体思路, 是用两轮for循环加if条件语句,循环比较前后两项,较大项,将其后置.也可以较小项后置.

  算法时间复杂度一般为O(n^2),最少为O(n),最大为O(n^2).

  源码:

function Bubble(arr){
            var mid;
            var len = arr.length-1;
            for(i = 0;i< arr.length;i++){
 
                for(j = 0;j < len; j++){
                    if(arr[j+1] < arr[j]){
                        mid = arr[j];
                        arr[j] = arr[j+1];
                        arr[j+1] = mid;
                    }
                }
            console.log(arr);
            }
            return arr
        }
  var a = Bubble([1,2,3,4,5,6,7,3,4,5])
 console.log(a)   

如果是对以上的数组进行排序,其实根本不需要执行 n^2 那么多次数,数组就已经将顺序排好了.那么我们就可以将其优化,当数组已经不进行比较的时候,就停止循环.

function Bubble(arr){
            var mid;
            var len = arr.length-1;
           var position = 0;
            for(i = 0;i< arr.length;i++){
                var flag = 0;
                for(j = 0;j < len; j++){
                    if(arr[j+1] < arr[j]){
                        mid = arr[j];
                        arr[j] = arr[j+1];
                        arr[j+1] = mid;
                        flag++;
                    }
                }
                console.log(arr);
                if(flag == 0){break;}// 
            }
            return arr
        }
        var a = Bubble([1,2,3,4,5,6,7,3,4,5,8])

每次外层循环开始的时候声明变量 flag  = 0;如果此次循环当中没有发生交换,也就是if语句后面没有执行的话,那么就说明,数组已经完成排序,所以直接跳出.

如果排序的 数组是[1,2,3,4,5,6] 那么数组执行一次外层for循环之后就会停止,这也是O(n)的由来.

但是,有些元素在循环执行一次之后,其实已经到了应该到的位置,比如说 8这个数字,已经不需要比较了,所以我们应该找到内部的for循环的 交换位置的最后一个数字,并且减少循环长度.

function Bubble(arr){
            var mid;
            var len = arr.length-1;
           var position = 0;
            for(i = 0;i< arr.length;i++){
                var flag = 0;
                for(j = 0;j < len; j++){
                    if(arr[j+1] < arr[j]){
                        mid = arr[j];
                        arr[j] = arr[j+1];
                        arr[j+1] = mid;
                        flag++;
                        position = j;
                    }
                }
                len = j;
                console.log(arr);
                alert(flag);
                if(flag == 0){break;}//为什么不会终止?
            }
            return arr
        }
        var a = Bubble([1,2,3,4,5,6,7,3,4,5,8])

加入position,记录最后一次if语句执行的位置,开始下一次内层for循环的时候,循环长度缩短.达到优化的目的.

 

posted @ 2020-05-20 14:47  fmkeke  阅读(546)  评论(1)    收藏  举报