Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >冒泡排序如何优化?

冒泡排序如何优化?

作者头像
刘嘿哈
发布于 2022-10-25 06:19:03
发布于 2022-10-25 06:19:03
51700
代码可运行
举报
文章被收录于专栏:js笔记js笔记
运行总次数:0
代码可运行

冒泡排序,是经典的排序算法之一,简单粗暴,但是性能一般

思路

大概是循环遍历这个数组 ,遍历次数为数组的length减1次,长度为3的数据,把前两个元素与其他每个元素比较一次即可,最后一个元素,被动比较即可(例如数组:[2,4,1],一共三个元素,length为3,排序需要比较两轮即可,第一轮2与4比较,因为2小于4,所以位置不动,下标向下移动一位,4和1比较,因为4大于1,所以位置互换,首轮排序结束结果:[2,1,4],进入下次循环,2和1比较,位置互换,下标向下移动一位,2和4比较,位置不变,排序结束) h代码实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr=[2,4,5,6,7,9,7,6,5,4,3,1]function maopao(arr){
    
    var x=0;
    var len=arr.length;
    for (var i = 0; i <len-1; i++) {
h        for (var j = 0; j < len-1; j++) {
            x++;
            if(arr[j]>arr[j+1]){
                mid=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=mid;
            }
        }
    }
    console.log(x,'循环了几次')   // 132 次
    return arr;
}
console.log(maopao(arr));

这样写有点浪费性能,因为每一次循环,后面都会多一个元素是排序完成的,所以,j的限制条件有误

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function maopao(arr){
    
    var x=0;
    var len=arr.length;
    for (var i = 0; i <len-1; i++) {
        x++;
// 每比完一个元素,后面就多一个排序完成的元素,不必重比
        for (var j = 0; j < len-1-i; j++) {
            x++;
            if(arr[j]>arr[j+1]){
                mid=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=mid;
            }
        }
     
    }
    console.log(x,'循环了几次')
    return arr;
}  

根据上面的思路可得,后面排序完成的部分不必再排。所以

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function maopao(arr){
    
    var x=0;
    var mid=null
    var len=arr.length;
    var maxChangeIndex=len;
    var max=len;
    for (let i = 0; i <len-1; i++) {
        x++;
        for (let j = 0; j < maxChangeIndex; j++) {
            x++;
            if(arr[j]>arr[j+1]){
                // 循环结束后最后修改位置就排序未完成的末端
                max=j;
                mid=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=mid;
            }
        }
        maxChangeIndex=max;
    }
    console.log(x,'循环了几次')
    return arr;
}

反过来想前面已经排序完成的点是否也可以记录,就是第一次改变位置的前一位。下次比较不必从零开始

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function maopao(arr){
    
    var x=0;
    var mid=null
    var len=arr.length;
    var maxChangeIndex=len;
    var minChangeIndex=0;
    var max=len;
    var min=0;
    var flag=true;
    for (let i = 0; i <len-1; i++) {
        x++;
        for (let j = minChangeIndex; j < maxChangeIndex; j++) {
            x++;
            if(arr[j]>arr[j+1]){
                if(flag){
                    min=j===0?0:(j-1);
                    flag=false;
                }
                max=j;
                mid=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=mid;
            }
        }
        flag=true;
        minChangeIndex=min;
        maxChangeIndex=max;
    }
    console.log(x,'循环了几次')
    return arr;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
冒泡排序
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
Tz一号
2022/05/11
2950
冒泡排序,两种实现以及优化
比如:第一次排序,内层循环两两对比互换位置,将一个最值放到最后,第二次排序,内层循环又继续通过两两对比互换位置,将剩下的值中的最值放到倒数第二个位置,因为互换位置是通过两两对比的方式,所以交换次数的时间复杂度是O(n²)
hss
2022/02/25
4510
JavaScript实现八大内部排序算法
注:基数排序中:r是关键字的基数,d是长度,n是关键字的个数 1.插入排序 基本思想:在序号i之前的元素(0到i-1)已经排好序,本趟需要找到i对应的元素x (此时即arr[i]) 的正确位置k,在寻
用户1149564
2018/01/11
7270
JavaScript实现八大内部排序算法
选择排序
比如,第一次排序,所有元素(n)都是未排序的,就在所有元素里选出最小值,然后将这个最小值和第一个位置互换,然后第二次在剩余的元素(n-1)里先选出最小值(也就是全部元素(n)的第二小值),然后把最小值和第而个值互换位置,......以此类推,知道找到第n-1个元素和n互换位置后,第n个位置不用比较了,因为他就是最大值。
hss
2022/02/25
3220
冒泡排序
生活中,好奇的人们靠近池塘发现,鱼儿冒气泡,越往上气泡越大,似乎扔一块石头下去,也能有类似的效果。我们总结出一个规律就是从池塘底部到池塘表面它的气泡是由小到大排列的,诸如此类的排序,我们可以将其称之为冒泡排序。在计算机中,有意思的是,你可以选择性地操作数据,去让它实现由小到大或者由大到小地冒泡顺序。
江涛学编程
2020/07/21
4420
数组经典的算法。(冒泡排序,选择排序,二分法查找)
算法原则(从小到大):先用数组第一个空间值和数组其他空间值依次作比较,如果找到比第一个空间值小的就把第一个值和当前值进行调换。依次比较完所有的内容,第一个空间值存放的一定是最小值。第一值比较完,在进行类推。比较完数组的所有位置。
百思不得小赵
2022/12/01
4320
JS手撕(十) 冒泡排序、插入排序
冒泡排序原理就是依次比较相邻元素,如果前面的比后面的大,那就互换位置。从第一对比到最后一对。第一轮比较完最大的数就会浮到最右边,第二轮,第二个大叔浮到倒数第二个位置……
赤蓝紫
2023/01/01
1.1K0
JS手撕(十) 冒泡排序、插入排序
JS算法之常规排序算法
大家好,我是柒八九。因为,最近在看Vue3 源码分析,发现无论React还是Vue,在框架层面,为了实现特定的场景,它们为我们封装了很多比较复杂的逻辑。比如,
前端柒八九
2022/08/25
4.5K0
JS算法之常规排序算法
前端常见算法(js)「建议收藏」
不管是在实际项目中还是在面试的时候我们大都会碰到算法问题,比如排序啊,比较大小啊之类的这些最基本的算法。我总结了一些,以后在碰到在慢慢补充。
全栈程序员站长
2022/09/14
5900
排序算法总结与实现
写在前面 一直很惧怕算法,总是感觉特别伤脑子,因此至今为止,几种基本的排序算法一直都不是很清楚,更别说时间复杂度、空间复杂度什么的了。 今天抽空理了一下,其实感觉还好,并没有那么可怕,虽然代码写出来还是磕磕绊绊,但是思想和原理还是大致上摸清楚了,记录、分享。 说明 关于排序,前辈们已经讲解的够多了,我这里主要摘录一些概念。 排序算法分类 比较排序,时间复杂度为O(nlogn) ~ O(n^2),主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等 非比较排序,时间复杂度可以达到O(n),主要有
糊糊糊糊糊了
2018/05/09
8180
js 实现冒泡排序及优化方案
参考链接:https://blog.csdn.net/hcz666/article/details/117810787
蓓蕾心晴
2022/09/24
8170
编程篇(003)-用 js 实现一个标准的排序算法
参考答案: 一. 冒泡排序 它是最慢的排序算法之一,但也是一种最容易实现的排序算法。 之所以叫冒泡排序是因为使用这种排序算法排序时,数据值会像气泡一样从数组的一端漂浮到另一端。假设正在将一组数字按照升序排列,较大的值会浮动到数组的右侧,而较小的值则会浮动到数组的左侧。之所以会产生这种现象是因为算法会多次在数组中移动,比较相邻的数据,当左侧值大于右侧值时将它们进行互换。
齐丶先丶森
2022/05/12
3100
冒泡排序,选择排序,插入排序算法
冒泡排序 思路:二二交换,可以让最大的数沉底,在length-1次,就有序了 package day20180315; public class Maopao { public static void main(String[] args) { int[] test= {-9,88,12,75,36,-621,10}; mpsort(test); System.out.print(" sort the end of:"); display(te
热心的社会主义接班人
2018/04/27
7500
冒泡排序,选择排序,插入排序,折半插入排序
冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录的为止,这里的反序指的是不符合当前指定排序规则的数字
大忽悠爱学习
2021/11/15
3200
前端10大排序算法
用户6297767
2023/11/21
1920
前端10大排序算法
六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
这里如果max的最大值为0下标的时候,max已经被 minIndex交换,maxIndex等于minIndex获取最大元素的下标值即可。
如烟花般绚烂却又稍纵即逝
2024/12/26
2010
六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
JavaScript实现冒泡排序
对数组进行 冒泡排序 算是比较简单的,冒泡排序也是容易理解的一种排序算法了,在面试的时候,很可能就会问到。
FEWY
2019/05/26
6170
手撕常见JS面试题
高阶函数实现AOP(面向切面编程) Function.prototype.before = function (beforefn) { let _self = this; // 缓存原函数的引用 returnfunction () { // 代理函数 beforefn.apply(this, arguments); // 执行前置函数 return _self.apply(this, arguments); // 执行原函数
helloworld1024
2022/10/14
5400
排序
冒泡排序 执行时间 image.png let arr = []; for (let i = 0; i < 80000; i++) { arr[i] = Math.floor(Math.random() * 80000); } console.time('x'); sort(arr); console.timeEnd('x'); function sort(arr) { let temp; // 优化点,如果某次冒泡并没有交换,那后面都不需要交换了 let flag = false;
刘嘿哈
2022/10/25
1480
排序
JavaScript刷LeetCode心得
其实,可能性问题使用动态规划要比使用 DFS、BFS 算法更加简单而容易理解。(我使用 DFS 经常报 TLE)
js2030code
2022/10/25
4170
相关推荐
冒泡排序
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验