Javascript中,实现十大排序方法之一(冒泡排序及其优化设想)
冒泡排序的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中,实现十大排序方法之一(冒泡排序及其优化设想)的更多相关文章
- [ 转载 ] js十大排序算法:冒泡排序
js十大排序算法:冒泡排序 http://www.cnblogs.com/beli/p/6297741.html
- JavaScript中数组Array.sort()排序方法详解
JavaScript中数组的sort()方法主要用于对数组的元素进行排序.其中,sort()方法有一个可选参数.但是,此参数必须是函数. 数组在调用sort()方法时,如果没有传参将按字母顺序(字符编 ...
- js十大排序算法:冒泡排序
排序算法说明: (1)对于评述算法优劣术语的说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面:不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面: 内排序:所有排 ...
- 十大排序算法JavaScript实现总结
花费了几周的时间断断续续的练习和模仿与使用JavaScript代码实现了十大排序算法. 里面有每种算法的动图和静态图片演示,看到图片可以自己先按照图片的思路实现一下. github中正文链接,点击查看 ...
- Atitit.现实生活中最好使用的排序方法-----ati排序法总结
Atitit.现实生活中最好使用的排序方法-----ati排序法总结 1. 现在的问题 1 2. 排序的类别::插入排序//交换排序//选择排序(每次最小/大排在相应的位置 )//归并排序//基数排 ...
- 十大排序算法总结(Python3实现)
十大排序算法总结(Python3实现) 本文链接:https://blog.csdn.net/aiya_aiya_/article/details/79846380 目录 一.概述 二.算法简介及代码 ...
- 一篇夯实一个知识点系列--python实现十大排序算法
写在前面 排序是查找是算法中最重要的两个概念,我们大多数情况下都在进行查找和排序.科学家们穷尽努力,想使得排序和查找能够更加快速.本篇文章用Python实现十大排序算法. 干货儿 排序算法从不同维度可 ...
- [转载]JavaScript 中小数和大整数的精度丢失
标题: JavaScript 中小数和大整数的精度丢失作者: Demon链接: http://demon.tw/copy-paste/javascript-precision.html版权: 本博客的 ...
- Algorithm --> 十大排序算法
十大排序算法 主要排序法有: 一.冒泡( Bubble)排序—— 相邻交换 二.选择排序 ——每次最小/ 大排在相应的位置 三.插入排序 ——将下一个插入已排好的序列中 四.壳( Shell) ...
随机推荐
- java网络爬虫,乱码问题终于完美解决
第一次写爬虫,被乱码问题困扰两天,试了很多方法都不可以,今天随便一试,居然好了. 在获取网页时创建了一个缓冲字节输入流,问题就在这个流上,添加标红代码即可 BufferedReader in = nu ...
- HashMap源码分析(二):看完彻底了解HashMap
上文讲到HashMap的增加方法,现在继续 上文链接 HashMap在上一篇源码分析的文章中,如果使用put的时候如果元素数量超过threshold就会调用resize进行扩容 1.扩容机制 想要了解 ...
- WinForm控件之【CheckedListBox】
基本介绍 复选框列表控件,以复选框的形式将一个或多个项列表展示,从目前的情况来看应用非常有限并不广泛. 常设置属性.事件 CheckOnClick:值为true时单击项即可更改项的勾选状态,值为fal ...
- 浅谈tomcat 、apache、 nginx的区别及优缺点
(~~排版垃圾~~,此文纪念自己18年6月所作为,如有不适合之处,请告知.) 本文主要说明tomcat .apache. nginx的定义.区别及优缺点 一. 定义: 1. Apache Apache ...
- C# 中异常抛出捕获机制--throw / try,catch,finally
try { messagebox.show("true"); } catch { messagebox.show("false"); } finally { m ...
- 曹工杂谈:手把手带你读懂 JVM 的 gc 日志
一.前言 今天下午本来在划水,突然看到微信联系人那一个红点点,看了下,应该是博客园的朋友.加了后,这位朋友问了我一个问题: 问我,这两块有什么关系? 看到这段 gc 日志,一瞬间脑子还有点懵,嗯,这个 ...
- JavaScript的面向对象原理之原型链
二.JavaScript的对象 为了能够清楚的解释这一切,我先从对象讲起.从其他面向对象语言(如Java)而来的人可能认为在JS里的对象也是由类来实例化出来的,并且是由属性和方法组成的. 实际上在JS ...
- 【Android Studio】Frameworks detected: Android framework is detected in the project Configure
刚开始在 Mac 上用 Android Studio, 打开第一个项目就遇到了问题,描述如下: 上午9:: Frameworks detected: Android framework is dete ...
- Mybatis整合Spring 使用
1.继承通用的Mapper<T>,必须指定泛型<T> 例如下面的例子: public interface UserInfoMapper extends Mapper<Us ...
- &= 的含义
这是一个缩略式子,展开之后的结果是a = a & b;&是按位与的操作符. 按位与运算:参加运算的两个数据,按二进位进行“与”运算.如果两个相应的二进位都为1,则该位的结果值为1,否则 ...