冒泡排序的Javascript实现

首先定义一个取值范围在(0~100000)之间的随机值的长度为10万的数组,

 function bubbleSort(arr) {
console.time('冒泡排序耗时');
var len = arr.length,temp;
for(var i=0;i<len;i++){
for(j=0;j<len-i-1;j++){
if(arr[j]>arr[j+1]){
temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
console.timeEnd('冒泡排序耗时');
return arr;
} var array = []; for(var i=0;i<100000;i++){
var x = Math.random()*100000;
var y = Math.floor(x);
array.push(y);
} console.log(bubbleSort(array));
//冒泡排序十次平均耗时: 37019.239013671875ms

下面我们来看一下在javascript中的array原型链上的sort()方法的特点

 function Sort(arr) {
console.time('排序耗时');
var arr1= arr.sort(function(a,b){return a-b});
console.timeEnd('排序耗时');
return arr1; } Sort(array); //排序十次平均耗时: 79.05419921875ms

由上面的代码可以知道,javasrcipt中array原型链上的sort方法的效率是很高的

//冒泡排序的改良方法(一)

function bubbleSort1(arr) {
  console.time('改进后冒泡排序耗时一');
  var i = arr.length-1,tmp; //初始时,最后位置保持不变  
  while ( i> 0) {
    var pos= 0; //每趟开始时,无记录交换
    for (var j= 0; j< i; j++){
      if (arr[j]> arr[j+1]) {
         pos= j; //记录交换的位置
         tmp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
      }
    }
    i= pos; //为下一趟排序作准备
  }
  console.timeEnd('改进后冒泡排序耗时一');
  return arr;
} console.log(bubbleSort1(array));
// 改进后冒泡排序十次平均耗时: 30493.7470703125ms

//冒泡排序的改良方法(二)

 function bubbleSort2(arr) {
  var low = 0;
  var high= arr.length-1; //设置变量的初始值
  var tmp,j;
  console.time('改进后冒泡排序耗时二');
  while (low < high) {
    for (j= low; j< high; ++j) { //正向冒泡,找到最大者
      if (arr[j]> arr[j+1]) {
        tmp = arr[j]; arr[j]=arr[j+1];arr[j+1]=tmp;
      }
    }
    --high; //修改high值, 前移一位
    for (j=high; j>low; --j) { //反向冒泡,找到最小者
      if (arr[j]<arr[j-1]) {
        tmp = arr[j]; arr[j]=arr[j-1];arr[j-1]=tmp;
      }
    } 
    ++low; //修改low值,后移一位
  }
  console.timeEnd('改进后冒泡排序耗时二');
  return arr;
} console.log(bubbleSort2(array));
// 改进后冒泡排序十次平均耗时: 23629.715087890625ms

//冒泡排序的改良方法(三)

 function bubbleSort3(arr) {
  var low = 0;
  var high= arr.length-1; //设置变量的初始值
  var tmp,j;
  console.time('改进后冒泡排序耗时三');
  while (low < high) {
    var pos1 = 0,pos2=0;
    for (let i= low; i< high; ++i) { //正向冒泡,找到最大者
      if (arr[i]> arr[i+1]) {
        tmp = arr[i]; arr[i]=arr[i+1];arr[i+1]=tmp;
        pos1 = i ;
      }
    }     high = pos1;// 记录上次位置     for (let j=high; j>low; --j) { //反向冒泡,找到最小者
      if (arr[j]<arr[j-1]) {
        tmp = arr[j]; arr[j]=arr[j-1];arr[j-1]=tmp;  
        pos2 = j;
      }
    }   
    
    low = pos2; //修改low值
  }
  console.timeEnd('改进后冒泡排序耗时三');
  return arr;
} console.log(bubbleSort3(array));
// 改进后冒泡排序十次平均耗时: 20408.427734375ms

由上面的运行结果可知,冒泡排序虽然是比较常用的排序方法,但其实其执行效率是比较低的

冒泡排序的平均时间维度为: O(n*n)    最好的情况 O(n)  最差的情况  : O(n*n)      空间复杂度 O(1)  排序方式: in-place    稳定性:稳定

图片名词解释:
n: 数据规模
k:“桶”的个数
In-place: 占用常数内存,不占用额外内存
Out-place: 占用额外内存

稳定:即如果两个数相等,那么位置不会交换

不稳定:如果两个数相等,那么也有可能交换位置

Javascript中,实现十大排序方法之一(冒泡排序及其优化设想)的更多相关文章

  1. [ 转载 ] js十大排序算法:冒泡排序

    js十大排序算法:冒泡排序  http://www.cnblogs.com/beli/p/6297741.html

  2. JavaScript中数组Array.sort()排序方法详解

    JavaScript中数组的sort()方法主要用于对数组的元素进行排序.其中,sort()方法有一个可选参数.但是,此参数必须是函数. 数组在调用sort()方法时,如果没有传参将按字母顺序(字符编 ...

  3. js十大排序算法:冒泡排序

    排序算法说明: (1)对于评述算法优劣术语的说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面:不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面: 内排序:所有排 ...

  4. 十大排序算法JavaScript实现总结

    花费了几周的时间断断续续的练习和模仿与使用JavaScript代码实现了十大排序算法. 里面有每种算法的动图和静态图片演示,看到图片可以自己先按照图片的思路实现一下. github中正文链接,点击查看 ...

  5. Atitit.现实生活中最好使用的排序方法-----ati排序法总结

    Atitit.现实生活中最好使用的排序方法-----ati排序法总结 1. 现在的问题 1 2. 排序的类别::插入排序//交换排序//选择排序(每次最小/大排在相应的位置  )//归并排序//基数排 ...

  6. 十大排序算法总结(Python3实现)

    十大排序算法总结(Python3实现) 本文链接:https://blog.csdn.net/aiya_aiya_/article/details/79846380 目录 一.概述 二.算法简介及代码 ...

  7. 一篇夯实一个知识点系列--python实现十大排序算法

    写在前面 排序是查找是算法中最重要的两个概念,我们大多数情况下都在进行查找和排序.科学家们穷尽努力,想使得排序和查找能够更加快速.本篇文章用Python实现十大排序算法. 干货儿 排序算法从不同维度可 ...

  8. [转载]JavaScript 中小数和大整数的精度丢失

    标题: JavaScript 中小数和大整数的精度丢失作者: Demon链接: http://demon.tw/copy-paste/javascript-precision.html版权: 本博客的 ...

  9. Algorithm --> 十大排序算法

    十大排序算法 主要排序法有:  一.冒泡( Bubble)排序—— 相邻交换  二.选择排序 ——每次最小/ 大排在相应的位置  三.插入排序 ——将下一个插入已排好的序列中  四.壳( Shell) ...

随机推荐

  1. 串门赛: NOIP2016模拟赛——By Marvolo 丢脸记

    前几天liu_runda来机房颓废,顺便扔给我们一个网址,说这上面有模拟赛,让我们感兴趣的去打一打.一开始还是没打算去看一下的,但是听std说好多人都打,想了一下,还是打一打吧,打着玩,然后就丢脸了. ...

  2. 第三章.定制专属的kali

    1.更新升级 • apt-get update • apt-get upgrade • apt-get dis-upgrade   2.根据个人喜好需求安装软件包 • 库 • Apt-get命令 • ...

  3. Java编程思想:构建复杂模型

    import sun.nio.cs.Surrogate; import java.util.ArrayList; import java.util.Random; public class Test ...

  4. 【bfs基础】①

    bfs,即广度优先搜索,主要通过队列(queue)进行操作. 稍微解释一下,队列是一种基础数据结构,其形态类似于一支长长的队伍,大概如下: 在C++中,队列的头文件定义为:#include<qu ...

  5. [记录]一则HTTP配置文件参考记录

    # cat ../conf/httpd.conf | grep -vE "^$|^#" ServerTokens OS ServerRoot "/etc/httpd&qu ...

  6. 小白学python之整型,布尔值,十进制二进制转换和字符串详解for循环!

    整型与字符串转化 十进制转二进制. python2,存在int 整型和long(长整型),在python3里就是int/获取的是浮点数 小数 print(bin(15)) 这样可以通过代码来计算十进制 ...

  7. 关于iphone手机上点击事件不起作用

    今天调试手机端H5页面的时候,发现一个很坑的问题,绑定的点击事件不起效果,安卓上都没问题,事件能正确触发,但是在iPhone没反应. 开始觉得是写法问题,后来发现,是由于iPhone上,点击的对象,必 ...

  8. 个人永久性免费-Excel催化剂功能第97波-快递单号批量查询物流信息

    电商时代,快递已进千万家,做电商零售行业的,快递信息的再挖掘,也显得更有意义,是数据精细化运营中必不可少的一环.一般站在系统的角度,数据用于业务流转的增删改查使用,而对于分析需求来说,这些业务系统里集 ...

  9. Excel催化剂图表系列之品味IBCS瀑布图观察企业利润构成

    IBCS图表,每个细节都值得反复琢磨参悟,此篇给大家送上详尽的瀑布图方式下的利润数据观察.请不要拿Excel2016版提供的瀑布图与IBCS版的瀑布图作对比,那完全不是一个级别的,可以类比为拿一辆经济 ...

  10. Excel催化剂开源第19波-一些虽简单但不知道时还是很难受的知识点

    通常许多的知识都是在知与不知之间,不一定非要很深奥,特别是Excel这样的应用工具层面,明明已经摆在那里,你不知道时,永远地不知道,知道了,简单学习下就已经实现出最终的功能效果. 在程序猿世界里,也是 ...