冒泡排序(js版)

基本思想:两两比较相邻记录的关键字,如果反序则交换,直至没有反序为止。

  • 最初的冒泡排序(初级版):
 1 //从小到大
 2 function BubbleSort(arr){
 3     var i,j,temp;
 4     for(i=0;i<arr.length-1;i++){
 5         for(j=i+1;j<arr.length;j++){
 6             if(arr[i]>arr[j]){
 7                 temp=arr[j];
 8                 arr[j]=arr[i];
 9                 arr[i]=temp;
10             }
11         }
12     }
13     return arr;
14 }
15 var arr=[10,7,9,11,22,33,4,2,0,1000];
16 BubbleSort(arr);  17 console.log(arr); //[0, 2, 4, 7, 9, 10, 11, 22, 33, 1000]

由于这样的排序仅仅是交换顺序,不算是真正的冒泡排序,效率也比较低。

当i=0,

arr[0]和它后边的每一项进行比较大小,前者大于后者,则进行交换。始终保证arr[0]为最小值。

当i=1,(arr[0]已经为最小值,不需要进行比较,)

arr[1]和它后边的每一项进行比较大小,前者大于后者,则进行交换。始终保证arr[1]为最小值(除去arr[0]以外)。

.......直至i=arr.length-2时,保证前arr.length-1项均“比较”小(小于后边的所有项),此时不再需要进行比较。(当n个数,前n-1个为“比较”小的值后,最后一个还有什么比较的意义呢??)

  • 正宗的冒泡排序,将小的数字如同气泡一样慢慢的浮上表面。
 1     //从小到大
 2     function BubbleSort(arr){
 3         var i,j,temp;
 4         for(i=0;i<arr.length-1;i++){
 5             for(j=arr.length-1;j>i;j--){
 6                 if(arr[j]<arr[j-1]){ //j为从后往前循环
 7                     temp=arr[j-1];
 8                     arr[j-1]=arr[j];
 9                     arr[j]=temp;
10                 }
11             }
12         }
13         return arr;
14     }
15     var arr=[10,7,9,11,22,33,4,2,0,1000];
16     BubbleSort(arr);

17    console.log(arr);// [0, 2, 4, 7, 9, 10, 11, 22, 33, 1000]

当i=0时,

j的第1次循环:j=arr.length-1,j从数组的最后一项开始和前一项比较大小,当前者小于后者,交换位置。

j的第2次循环:j=arr.length-2,继续和前一项比较大小。

......直至j=1时结束。此时数组的第一项为最小值。

当i=2时,

j的第1次循环:j=arr.length-1,j从数组的最后一项开始和前一项比较大小,当前者小于后者,交换位置。

j的第2次循环:j=arr.length-2,继续和前一项比较大小。

......直至j=2时结束(即比较完第三项和第二项,第一项已经确定,不需要进行比较)。此时数组的第二项为最小值(除去第一项以外)。

继续循环i,i=arr.length-2时。比较j的第arr.length项和第i=arr.length-1项,即可得到最终结果。

  • 优化后的冒泡排序

当待排序的序列为{2,1,3,4,5,6,7,8,9},那么仅仅需要交换第一个和第二个关键字即可。但是前面的算法还是会将循环都执行一遍,造成了多余的计算。

此时我们可以添加一个标记变量flag。

 1 //从小到大
 2 function BubbleSort(arr){
 3     var i,j,temp;
 4     var flag=true;     //flag进行标记
 5     for(i=0;i<arr.length-1&&flag;i++){  //若flag为false则退出循环
 6         flag=false;    //初始化为false
 7         for(j=arr.length-1;j>i;j--){
 8             if(arr[j]<arr[j-1]){ //j为从前往后循环
 9                 temp=arr[j-1];
10                 arr[j-1]=arr[j];
11                 arr[j]=temp;
12                 flag=true; //如果有数据交换则为true
13             }
14         }
15     }
16     return arr;
17 }ishi
18 var arr=[10,7,9,11,22,33,4,2,0,1000];19 BubbleSort(arr);
20 console.log(arr);  // [0, 2, 4, 7, 9, 10, 11, 22, 33, 1000]

标记变量声明时状态为true,进行循环后,标记变量初始化为false状态。当后边的项两两进行比较时,发生交换则将标记变量状态更正为true,如果自始至终都没有发生标记变量的状态更正为true,说明为有序,则在外层循环的终止判断语句中将退出。

优化的关键在于:

在变量i的for循环中,增加了对flag是否为true的判断。通过这种改进,可以避免在有序的情况下进行无意义的循环判断。

看完大话数据结构,根据自己的理解整理了下,还请大家留下宝贵意见。

原文地址:https://www.cnblogs.com/alaner/p/9515070.html

时间: 2024-10-26 10:35:56

冒泡排序(js版)的相关文章

常见排序算法(JS版)

常见排序算法(JS版)包括: 内置排序,冒泡排序,选择排序,插入排序,希尔排序,快速排序(递归 & 堆栈),归并排序,堆排序,以及分析每种排序算法的执行时间. index.html 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>twobin 常见排序算法 (JS版) </title> 5 <meta http-equiv="content-type" content=&

全国三级城市联动 js版

/* * 全国三级城市联动 js版 * author: mrasong * E-mail: mrasong#163.com * version: 1.0.2 * data: tencent **/ function Dsy(){ this.Items = {}; } Dsy.prototype.add = function(id,iArray){ this.Items[id] = iArray; } Dsy.prototype.Exists = function(id){ if(typeof(t

纯css和js版下拉菜单

<!doctype html> <html> <head> <meta charset="utf-8"> <title>css版下拉菜单</title> <style type="text/css"> div,body,ul,li{padding:0;margin:0; list-style:none;} .all{width:550px; height:30px; backgrou

结合正则表达式验证数学公式(含变量,js版)

今天有朋友让我帮他写一个正则表达式,要求能验证一个数学公式格式是否正确. 数学公式中有括号,变量(未知数)和运算符,而且变量是重数据库中读取的,可以任意添加和删除. 这个用一个正则表达式实现是不可能的,所以我给他写了一个函数,如下: (function(){ /* * 假如待选变量: ID,NUM,TOTAL,AVL TEST * 正确的公式例子:ID*NUM+(TOTAL/AVL)*0.5 * 错误的公式例子:ID**|0.5 */ function fn(string, obj){// TO

JS版 数字 金额 格式化 方法

/** * JS版 数字 金额格式化 * @param string s 需要处理的数字串 * @param string n 保留小数的位数 */function fmoney(s, n) { n = n >= 0 && n <= 20 ? n : 2; s = parseFloat((s + "").replace(/[^\d\.-]/g, "")).toFixed(n) + "";//更改这里n数也可确定要保留的

JS版汉字与拼音互转终极方案,附简单的JS拼音输入法

原文:http://www.cnblogs.com/liuxianan/p/pinyinjs.html 前言 网上关于JS实现汉字和拼音互转的文章很多,但是比较杂乱,都是互相抄来抄去,而且有的不支持多音字,有的不支持声调,有的字典文件太大,还比如有时候我仅仅是需要获取汉字拼音首字母却要引入200kb的字典文件,无法根据实际需要满足需求. 综上,我精心整理并修改了网上几种常见的字典文件并简单封装了一下可以直接拿来用的工具库. 这篇文章差不多一个月前就写好了大部分了,但是就差拼音输入法这一块一直没时

Twitter面试题蓄水池蓄水量算法(原创 JS版,以后可能会补上C#的)

之前在群里有人讨论Twitter的面试题,蓄水池蓄水量计算,于是自己写了个JS版的(PS:主要后台代码还要编译,想想还是JS快,于是就使用了JS了.不过算法主要还是思路嘛,而且JS应该都没问题吧^_^;) 这里是题目: ---------------------------分割线------------------------ 蓄水池储水量问题 看图,可以将方块看做砖.题干很简单,问最多能放多少水.例如,图2就是图1可放的最多水(蓝色部分),如果将一块砖看做1的话,图2就是能放10个单位的水.图

js版 文章加密压缩算法 霍尔曼编码

题目缘由: 准备工作: 1.需要一个二叉树的数据结构 js版的,我准本用用数组表示,如下 var arr=[];//存放着对应的字符 字符$=>arr[0],$0=>arr[1],$1=>arr[2],$00=>arr[3],$01=>arr[4],$10=>arr[5],$11=>arr[6], 总结上面的规律,我需要做的是把一个二进制的数字,转化成10进制 function trans(strNum){ if(arguments.length==0){retu

JS版汉字与拼音互转终极方案,附简单的JS拼音

前言 网上关于JS实现汉字和拼音互转的文章很多,但是比较杂乱,都是互相抄来抄去,而且有的不支持多音字,有的不支持声调,有的字典文件太大,还比如有时候我仅仅是需要获取汉字拼音首字母却要引入200kb的字典文件,无法根据实际需要满足需求. 综上,我精心整理并修改了网上几种常见的字典文件并简单封装了一下可以直接拿来用的工具库. 代码和DEMO演示 github项目地址:https://github.com/liuxianan/pinyinjs 完整demo演示:http://demo.liuxiana

GIS(六)——实现js版搜狗地图周边搜索功能

在上一篇文章<GIS(五)--完成js版搜狗地图基本交互搜索功能>中,介绍了搜狗地图的关键字搜索功能,今天就实现以下另一个重要功能吧--那就是周边搜索功能. 按照惯例,还是把官网上的示例代码给大家贴出来.飞机票在此.周边搜索的功能,跟关键字搜索其实是一样的,也是主要用到的了SearchRequest这个类,点击这里查看api文档.SearchRequest 对象规范: 属性 类型 说明 map Map 进行搜索的地图实例 renderer SearchRenderer 将结果进行渲染的对象.也