JavaScript实现经典排序算法之冒泡排序


Posted in Javascript onDecember 28, 2016

冒泡排序可谓是最经典的排序算法了,它是基于比较的排序算法,时间复杂度为O(n^2),其优点是实现简单,n较小时性能较好。

1)算法原理
       相邻的数据进行两两比较,小数放在前面,大数放在后面,这样一趟下来,最小的数就被排在了第一位,第二趟也是如此,如此类推,直到所有的数据排序完成。

2)算法描述
       <1>比较相邻的元素。如果第一个比第二个大,就交换它们两个;
       <2>对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
       <3>针对所有的元素重复以上的步骤,除了最后一个;
       <4>重复步骤1~3,直到排序完成。
3)javascript代码实现

function bubbleSort(arr){  
  var len = arr.length;  
  for (var i = 0; i < len; i++) {  
    for(var j = 0; j < len - i -1; j++){  
      if(arr[j]>arr[j+1]){ //相邻元素进行对比  
        var temp = arr[j+1];//交换元素  
        arr[j+1] = arr[j];  
        arr[j] = temp;  
      }  
    }  
  }  
  return arr;//返回数组  
}  
  
var arr=[1,45,37,5,48,15,37,26,29,2,46,4,17,50,52];//调用排序算法  
console.log(bubbleSort(arr));//控制台输出结果

        这个算法是最基本的实现方法,接着进行改进这个算法,通过设置一个标志性的变量position,用于记录每趟排序中最后一次进行交换的位置。因为position位置之后的记录都已经排序好了,所以进行下一趟排序时只需要扫描到position的位置就好。
改进之后的算法如下:

function bubbleSort2(arr){  
  var i = arr.length -1;//开始时,扫描的最后位置  
  while(i>0){  
    var position = 0;//标志性变量,表示当前排序中交换的位置  
    for(var j = 0; j < i; j ++){  
      if(arr[j]>arr[j+1]){  
        position = j;  
        var temp = arr[j+1];  
        arr[j+1] = arr[j];  
        arr[j] = temp;  
      }  
    }  
    i = position;  
  }  
  return arr;  
}  
  
var arr=[1,45,37,5,48,15,37,26,29,2,46,4,17,50,52];  
console.log(bubbleSort2(arr));

      传统冒泡排序中每一趟排序操作只能找到一个最大值或最小值,我们考虑利用在每趟排序中进行正向和反向两遍冒泡的方法一次可以得到两个最终值(最大者和最小者) , 从而使排序趟数几乎减少了一半。
改进之后的算法如下:

function bubbleSort3(arr){  
  var low = 0;  
  var high = arr.length-1;  
  var temp;  
  while(low < high){//找到最大值  
    for(var j = low ; j < high ; j++){  
      if (arr[j]> arr[j+1]) {       
        temp = arr[j+1];  
        arr[j+1] = arr[j];  
        arr[j] = temp;  
       }  
    }  
    --high;//修改high值,向前移一位  
  }  
  while(low > high){//找到最小值  
    for(var j = high ;j > low; j--){  
      if (arr[j]> arr[j+1]) {       
        temp = arr[j+1];  
        arr[j+1] = arr[j];  
        arr[j] = temp;  
       }  
    }  
    ++low;//修改low值,往后移动一位  
  }  
  return arr;  
}  
var arr=[1,45,37,5,48,15,37,26,29,2,46,4,17,50,52];  
console.log(bubbleSort3(arr));

4)算法分析

      最佳情况:T(n) = O(n)
      最差情况:T(n) = O(n2)
      平均情况:T(n) = O(n2)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript判断两种格式的输入日期的正确性的代码
Mar 25 Javascript
几个高效,简洁的字符处理函数
Apr 12 Javascript
childNodes.length与children.length的区别
May 14 Javascript
让JavaScript 轻松支持函数重载 (Part 1 - 设计)
Aug 04 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
Sep 03 Javascript
jQuery实现自动滚动到页面顶端的方法
May 22 Javascript
jQuery中通过ajax的get()函数读取页面的方法
Feb 29 Javascript
javascript数据类型详解
Feb 07 Javascript
Angular企业级开发——MVC之控制器详解
Feb 20 Javascript
Vue实现移动端页面切换效果【推荐】
Nov 13 Javascript
vue 实现左右拖拽元素并且不超过他的父元素的宽度
Nov 30 Javascript
微信小程序使用map组件实现获取定位城市天气或者指定城市天气数据功能
Jan 22 Javascript
BootStrap Tooltip插件源码解析
Dec 27 #Javascript
获取当前月(季度/年)的最后一天(set相关操作及应用)
Dec 27 #Javascript
javascript实现文字无缝滚动
Dec 27 #Javascript
JavaScript仿聊天室聊天记录
Dec 27 #Javascript
基于jQuery实现顶部导航栏功能
Dec 27 #Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
Dec 27 #Javascript
基于jQuery实现左侧菜单栏可折叠功能
Dec 27 #Javascript
You might like
几种显示数据的方法的比较
2006/10/09 PHP
PHP DataGrid 实现代码
2009/08/12 PHP
PHPMyadmin 配置文件详解(配置)
2009/12/03 PHP
php file_put_contents()功能函数(集成了fopen、fwrite、fclose)
2011/05/24 PHP
php实现设计模式中的单例模式详解
2014/10/11 PHP
Zend Framework自定义Helper类相关注意事项总结
2016/03/14 PHP
[原创]PHP实现生成vcf vcard文件功能类定义与使用方法详解【附demo源码下载】
2017/09/02 PHP
Yii实现微信公众号场景二维码的方法实例
2020/08/30 PHP
JS小功能(checkbox实现全选和全取消)实例代码
2013/11/28 Javascript
JS网页图片按比例自适应缩放实现方法
2014/01/15 Javascript
JSON.parse()和JSON.stringify()使用介绍
2014/06/20 Javascript
JavaScript DOM进阶方法
2015/04/13 Javascript
JQuery勾选指定name的复选框集合并显示的方法
2015/05/18 Javascript
JS构造函数与原型prototype的区别介绍
2016/07/04 Javascript
如何利用JSHint减少JavaScript的错误
2016/08/23 Javascript
利用Node.js+Koa框架实现前后端交互的方法
2017/02/27 Javascript
AngularJS上传文件的示例代码
2018/11/10 Javascript
微信小程序出现wx.getLocation再次授权问题的解决方法分析
2019/01/16 Javascript
微信小程序mpvue点击按钮获取button值的方法
2019/05/29 Javascript
微信小程序实现点击卡片 翻转效果
2019/09/04 Javascript
JS实现商品橱窗特效
2020/01/09 Javascript
node.js使用yargs处理命令行参数操作示例
2020/02/11 Javascript
微信小程序实现比较功能的方法汇总(五种方法)
2020/03/07 Javascript
如何检测JavaScript中的死循环示例详解
2020/08/30 Javascript
Openlayers+EasyUI Tree动态实现图层控制
2020/09/28 Javascript
老生常谈Python startswith()函数与endswith函数
2017/09/08 Python
python编写计算器功能
2019/10/25 Python
学python爬虫能做什么
2020/07/29 Python
使用python爬取抖音app视频的实例代码
2020/12/01 Python
美国领先的水果篮送货公司和新鲜水果供应商:The Fruit Company
2018/02/13 全球购物
德国在线香料制造商:Gewürzland
2020/03/10 全球购物
Eton丹麦官网:精美的男式衬衫
2020/05/27 全球购物
初中优秀学生评语
2014/12/29 职场文书
工作检讨书大全
2015/01/26 职场文书
长城导游词300字
2015/01/30 职场文书
文员岗位职责
2015/02/04 职场文书