javascript实现冒泡排序及优化

Posted 十九万里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript实现冒泡排序及优化相关的知识,希望对你有一定的参考价值。

基本思想:

相邻的元素进行两两比较,根据条件进行位置交换,每一趟会把最大或者最小的元素“冒”到顶端。最终达到完全排序
利用两轮循环加if条件语句,循环比较前后两项,最后排序

冒泡排序平均时间复杂度为O(n2),最坏时间复杂度为O(n2),空间复杂度为O(1),是最稳定排序
名词解释:

时间复杂度:时间复杂度是指一个算法执行所耗费的时间
空间复杂度:是指运行完一个程序所需要内存的大小
稳定性:如果a=b a在b的前面,排序后a仍然在b的前面
不稳定性:如果a=b a在b的前面 ,排序之后可能会发生位置变化

冒泡排序:
平均时间复杂度:O(nn) 最好情况:O(n)
最差情况:O(n
n) 空间复杂度:O(1) 稳定性 :稳定

基础代码实现:

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)

运行如图:

冒泡排序有两种优化方式:

优化外层循环:记录当前循环中是否发生了变化,如果没有变化则直接结束

内层优化:记录当前循环中最后一次元素交换的位置,改位置以后的序列都是已经排列好的序列,单独放一个数组李,下一轮循环的时候无需再去比较

优化后冒泡排序,最好的时间复杂度为O(n)

优化外层循环代码实现:

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 当内层循环没有执行的时候 判断放回的flag是0,则直接跳出循环。

继续优化:
有的元素在一次执行之后,已经到了应该的位置吗,不需要比较了,要在内部的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语句的执行 下一次循环的时候,及可以缩短循环的长度

以上是关于javascript实现冒泡排序及优化的主要内容,如果未能解决你的问题,请参考以下文章

冒泡排序的实现及优化和变形

挖掘算法中的数据结构:O(n^2)排序算法之 选择插入冒泡希尔排序 及 优化

冒泡排序及优化

JavaScript 7种实现排序方法原理

Java代码实现—冒泡排序

视频+图文+动画详解冒泡排序