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语句的执行 下一次循环的时候,及可以缩短循环的长度

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十九万里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值