js实现冒泡排序

冒泡排序就是相邻的两个数进行比较,将大的放在后面,小的放在前面。换句话说就是,前面的数比后面的数大,就交换位置,否则不换位置,图解:以数组   

51564558654

第一趟排序

第一次:51和56比较,不交换位置

51564558654

第二次:56和45比较,交换位置

51455658654

第三次:56和5比较,交换位置

51455568654

第四次:56和86比较,不交换位置

51455568654

第五次:86和54比较,交换位置

514555654

86

第一趟得到结果   51,45,5,56,54,86


第二趟排序

第一次:51和45比较,交换位置

455155654

86

第二次:51和5比较,交换位置

455515654

86

第三次:51和56比较,不交换位置

455515654

86

第四次:56和54比较,交换位置

455515456

86

第二趟得到的结果:

4555154

56

86


第三趟排序

第一次:45和5比较,交换位置

5455154

56

86

第二次:45和51比较,不换位置

5455154

56

86

第三次:51和54比较,不交换位置

5455154

56

86

第三趟得到的结果:

54551

54

56

86


第四趟排序

第一次:5和45比较,不交换位置

54551

54

56

86

 

第二次:45和51比较,不交换位置

54551

54

56

86

第三趟得到的结果:

545

51

54

56

86


第五趟排序

第一次:5和45比较,不交换位置

545

51

54

56

86

第五趟得到结果

5

45

51

54

56

86


最终结果为

5

45

51

54

56

86


 代码实现:

function Res(arr){
    let temp;
    for(let i=0;i<arr.length-1;i++){   //执行多少趟

        for(let j=0;j<arr.length-1;j++){   
            if(arr[j]>arr[j+1]){
                temp = arr[j];
                arr[j] =  arr[j+1]
                arr[j+1] =temp;
            }
        }
    }
    return arr
}
console.log(Res([5,4,2,6,7,8,2]))

这样就基本把冒泡写好了,时间复杂度是O(n*n),但是还可以优化一下

 

因为我们的代码的第二个for循环,长度每次都是 j<arr.length-1  如第一趟把 86 放在最后面了

514555654

86

按照  j<arr.length-1  后面依然会和86对比,但实际情况是,我们不需要和86对比

也就是说趟之后,对比的长度要减少一位

function Res(arr){
    let temp;
    for(let i=0;i<arr.length-1;i++){   //执行多少趟

        for(let j=0;j<arr.length-1-i;j++){    //  改动了这里
            if(arr[j]>arr[j+1]){
                temp = arr[j];
                arr[j] =  arr[j+1]
                arr[j+1] =temp;
            }
        }
    }
    return arr
}
console.log(Res([5,4,2,6,7,8,2]))

这样得到的时间复杂度也是n*n, 但是减少了不必要的排序

但是还可以再优化一下,比如有时候会有这种情况,例如数组

12354

按照冒泡排序,只需要一遍就可以排序完了,但是上面的代码,会一直排序到最后,不会判断当前的数组是否已经排序完毕,所以这时候我们可以这么做,我把思路写下来。

首先我们设置一个    标志

如果整一趟都不需要换位置的时候                是不是意味着排序完了?是的吧?

在某一趟全部不需要置换的时候,就排序完了

 

function Res(arr){
    let temp;
    let makesure = true;   //这就是标志
    var count = 0
    for(let i=0;i<arr.length-1;i++){   // 执行多少趟
        
        console.log("第"+ ++count+"趟开始")
        makesure = true;
        for(let j=0;j<arr.length-1-i;j++){    //  改动了这里
            if(arr[j]>arr[j+1]){
                temp = arr[j];
                arr[j] =  arr[j+1]
                arr[j+1] =temp;
                makesure = false;
            }
        }
        if(makesure == true){
            break;
        }
    }
    return arr
}
console.log(Res([1,2,3,5,4]))

就执行了2趟,因为第二趟不需要置换位置,所以就认为全部置换完毕

 

这时候最好的结果就是执行了1遍,复杂度就是O(n)

 

所以冒泡排序的时间复杂度是

最好情况最坏情况平均情况 
O(n)O(n*n) O(n*n)

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值