当前位置: 首页 > news >正文

排序算法总结第二弹----冒泡排序---javascript描述

上篇博文总结了选择排序,这篇来看冒泡排序,接上篇。

冒泡排序思想:若是正再将一组数据升序排序,

第一趟:比较相邻的数据,当左侧值大于右侧值将他们进行交换,将较小值向前浮动,大值向后冒泡,直至比较到最后一个元素,则最大的数必然冒泡到最后一个元素。

第二趟:用同样的方法比较前面的n-1个纪录,以此进行比较和交换,第2大的数就会冒到倒数第2个元素。

........

以此类推,直到i=n-1最后一趟比较完为止。

js代码如下:

function bubbleSort(arr) {
        for (var i = 0; i < arr.length; i++) {
            for (var j = 0; j < arr.length - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    var temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        return arr;
    }

但是上边算法有点小问题,复杂度有点高,试想如果关键字序列为31,12,42,55,68,90,那么第一趟排序结果为12,31,42,55,68,90,显然,序列已经升序有序,就可以直接结束整个排序,而不是继续排序。因此改进算法如下:设置flag标志,用来标志是否进行交换排序,从而跟踪序列是否已经有序

代码算法如下:

function bubbleSort1(arr) {
        var flag = true;
        for (var i = 0; i < arr.length && flag; i++) {
            flag = false;
            for (var j = 0; j < arr.length - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    var temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    flag = true;
                }
            }
        }
        return arr;
    }

冒泡排序是最慢的排序算法之一。

时间复杂度分析:最好情况下已经有序,故外层循环只需要进行1次就结束整个排序过程,最小时间复杂度为O(n)。最差的情况外层最多进行n-1次,内层循环进行n-i次,所以时间复杂度为O(n*n)。

稳定性:冒泡排序是一中稳定的排序算法。

空间复杂度:需要一个辅助空间进行交换,故为O(1).

转载于:https://www.cnblogs.com/hxc555/p/5905392.html

相关文章:

  • Codeforces710C【数学】
  • 【20160924】GOCVHelper 图像处理部分(2)
  • bash的工作特性及其使用方法
  • ajax执行时提示
  • PHP简单漂亮的分页类
  • 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。...
  • fgets()函数读取键盘,去掉换行符或丢弃多余的字符
  • 解决Only a type can be imported. com.mysql.jdbc.Connection resolves to a package的报错问题
  • Java_I/O输入输出_使用输入输出流读取文件,将一段文字加密后存入文件,然后读取,将加密前与后的文件输出...
  • Servlet类源码说明
  • 连接 insance 到 vlan101 - 每天5分钟玩转 OpenStack(97)
  • 15、限定词
  • Automated Memory Analysis
  • 5.openstack之mitaka搭建计算节点
  • 改变Chrome浏览器主程序_缓存_个人信息路径
  • 【剑指offer】让抽象问题具体化
  • 10个确保微服务与容器安全的最佳实践
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • 4个实用的微服务测试策略
  • Angular4 模板式表单用法以及验证
  • Create React App 使用
  • eclipse(luna)创建web工程
  • EOS是什么
  • extjs4学习之配置
  • JAVA SE 6 GC调优笔记
  • Java程序员幽默爆笑锦集
  • magento2项目上线注意事项
  • MySQL数据库运维之数据恢复
  • Node 版本管理
  • Ruby 2.x 源代码分析:扩展 概述
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 对JS继承的一点思考
  • 力扣(LeetCode)56
  • 免费小说阅读小程序
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 入门级的git使用指北
  • 小程序测试方案初探
  • 学习笔记TF060:图像语音结合,看图说话
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • Android开发者必备:推荐一款助力开发的开源APP
  • 扩展资源服务器解决oauth2 性能瓶颈
  • #ifdef 的技巧用法
  • #Java第九次作业--输入输出流和文件操作
  • #微信小程序(布局、渲染层基础知识)
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (三十五)大数据实战——Superset可视化平台搭建
  • (图)IntelliTrace Tools 跟踪云端程序
  • (学习日记)2024.01.19
  • (一)SpringBoot3---尚硅谷总结
  • .axf 转化 .bin文件 的方法
  • .bat批处理(五):遍历指定目录下资源文件并更新