让冒泡排序的对比次数更少(js实例)

一般网上的冒泡排序例子是这样的:

function bubbleSort(arr) {
  let i = arr.length;
    let tempExchangVal = undefined;
    while (i > 0) {
        for (let j = 0; j < i - 1; j++) {
       num++;
            if (arr[j] > arr[j + 1]) {
                tempExchangVal = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tempExchangVal;
            }
        }
        i--;
    }
    return arr;
}

let arr = [3, 2, 4, 9, 5, 7, 1, 6, 8];
let num = 0; // 对比的次数变量
let arrSorted = bubbleSort(arr);
console.log(arrSorted); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
console.log(num); // 36

思路就是一个数组里有几个数字就循环几次取出索引来利用(为了称呼方便,称此次循环叫做大循环),然后将被取出的循环数字再带入数组循环一遍找出当前循环里最大的数(为了称呼方便,称此次循环叫做小循环),最大的数将被移到数组最尾部,并且使得在这过程中的数字位置能够调整规范。小循环后再将 i 变量减一,用来进行下一个大循环并且使小循环不会循环到之前已经移到数组最尾部的数字。

但这种写法有个弊端就是如果上次循环已经对比整理了前后数组,这次循环还会再进行对比,不过不会再整理,这样算是多做了无用功。举个例子:上次循环已经把最前面的3个数字3、2、4对比排列成了2、3、4,这次循环依然还会再对比一次2和3跟3和4。这其实是可以不用对比的,因为之前已经对比排列过了,再对比一次只能算是多此一举,像上面这种,已经对比了36次,其中有很大一部分是重复的对比。

后来,我自己想出了另一种对比更少的算法:

let oldArr = [3, 2, 4, 9, 5, 7, 1, 6, 8]
let num = 0 // 对比次数的变量

function bubbleSort (arr, index = 0) {
  let indexAdd1 = index + 1
  for (let i = 0; indexAdd1 > 0; indexAdd1--) {
    let compareArr = [arr[indexAdd1 - 1], arr[indexAdd1]]
    num++
    if (compareArr[0] > compareArr[1]) {
      arr[indexAdd1 - 1] = compareArr[1]
      arr[indexAdd1] = compareArr[0]
    } else {
      break
    }
  }

  if (index < arr.length - 1) {
    return bubbleSort(arr, index + 1)
  } else {
    return arr
  }
}

let sortArr = bubbleSort(oldArr)
console.log(sortArr) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
console.log(num) // 19

我自己的思路是这样:循环一遍所有索引(大循环),每次循环执行函数时都会把上次循环处理过的数组带入进去,直到最后一个索引将最后处理的数组返回回去,每次进行大循环时,都会将要循环处理的索引和它的下一位比较,如果下一位比处理的索引大那就没问题,不进行操作,如果比它小就和其调换,然后再往后面进行对比调换,直到遇到一个比它还小的数才停止对比调换(小循环)。

例如:索引[0]是3,它的下一位是2,3比2大所以调换位置,调换后2后面没有索引了,所以没有再执行对比调换;由于上个循环有调换索引了,现在索引[1]还是3,它的下一位索引[2]是4,3比4小索引不调换;接着索引[2]是4,下一位索引[3]是9,4比9小所以也没调换位置;索引[3]是9,下一个索引[4]是5,9比5大那就必须调换位置了,现在索引[3]是5而索引[4]是9了,然后再将索引[3]和后面的索引对比,现在对比索引[2],索引[2]是4,比5小,所以无需再调换,因为之前已经按大小排序了,所以索引[2]后面的数肯定比索引[2]小,那也就无需再对比了,这样就可以节省几步了,而这几步也是第一个写法时重复的步骤;接着再从索引[4]开始对比,对比索引[5],然后按照结果看是要移动位置还是不用;索引[5]再对比索引[6],索引[6]再对比索引[7]。。。直到最后一位索引索引。

两种写法如果数组元素较少对比的次数可能不会差多少,不过如果数组元素比较多第一种算法就会进行很多重复的比较了。

原文地址:https://www.cnblogs.com/keka1996/p/8476856.html

时间: 2024-10-10 01:27:01

让冒泡排序的对比次数更少(js实例)的相关文章

字符串中第一个只出现一次的字符,如何优化算法使得遍历次数更少?

/** * 只允许遍历一遍字符串 */ public class 找出字符串中第一个只出现一次的字符 { public static void main(String[] args) { // 测试字符串 String str = "asdsacjj"; // 字符串转化成字符 char[] strToChar = str.toCharArray(); int len = strToChar.length;//字符串长度 //hashset用于判断是否出现过 HashSet<Ch

【转】使用 WebGL 进行 3D 开发,第 2 部分: 使用 WebGL 库以更少的编码做更多的事情

转自HTML5开发社区 使用 WebGL 进行 3D 开发,第 1 部分: WebGL 简介使用 WebGL 进行 3D 开发,第 2 部分: 使用 WebGL 库以更少的编码做更多的事情使用 WebGL 进行 3D 开发,第 3 部分: 添加用户交互 WebGL API 让 JavaScript 开发人员能够直接利用如今的 PC 及移动设备硬件中强大的内置 3D 图形加速功能.现代浏览器透明地支持 WebGL,它使人们可以为主流 Web 用户创建高性能的 3D 游戏.应用程序以及 3D 增强的

如何让手游更省带宽,耗电量更少?TBR渲染架构解析!

如何让手游更省带宽,耗电量更少?渲染或是其中一个可突破的点.本文中,腾讯游戏学院专家Hailong将从为大家解析TBR渲染架构的特点. 什么是TBR? 全称是Tile Based Rendering,主要用在移动设备(手机.平板)上的一种渲染架构,渲染时将屏幕分割成小块,分别渲染.每块大小为16×16 或32×32等(不同产品各不相同),特点是省带宽,耗电小. 与之对应的是IMR(Immediate Mode Rendering),提交的每个渲染要求都会立即开始,这是一种简单而又粗暴的思路,优点

如何花更少的时间学习更多的知识

花时间学习不见得就是真正的学习. 因为你的学习方法一开始就是错的话,那么花再多的时间在学习上也是无济于事. 所以你得看看这篇文章,如何花少量的时间却仍然学习到更多的知识.上帝给了我们每个人同样的时间,但是不同的人的效率确实不一样的,如果你觉得你的世界浪费了,先补习一下这篇文章:<暗时间>读书笔记与读后感. 一.知识整合法 聪明人不仅是学习成绩优异,更重要的是有独到的学习方法. 不像大多数学生凭记忆来求取好成绩,聪明的学生追求的是把知识串联起来构成一幅大的画面. 这也就是我所说的知识整合法. 知

如何编写高质量更少bug的程序

如何编写高质量更少bug的程序 ? 编写可复用代码 + 做得更多 + 做的更少 + 创造“编程心流”+ 严格的程序测试 一. 尽可能复用 .  编写可复用代码, 尽可能复用经过严格测试的可靠公共库.  代码复用.组件复用.框架复用. 接口规范复用.设计模式复用.开I发架构复用.  甚至应用模板复用: 复用使得你可以从 40% , 甚至 60% 快速起步, 而不是从 0% 开始.工作量的压力小了, 很大程度上会消减因为进度压力导致的代码质量低下的问题. 创建一个应用工程模板, 将你在实际工作项目中

Powerful Sleep(神奇的睡眠-睡眠生物钟的秘密:如何睡得更少却睡得更好)阅读笔记

睡眠机制 我们活着的时候,大脑会产生脑电波.脑电图仪器通过贴在人头上的一些电极读出脑电波的活动,然后把活动用图表显示出来. 睡眠过程可以分为5个过程,划分依据与大脑发出的脑电波类型. 当人清醒时,大脑发出β脑电波,人的意识高度活跃,思维敏锐. 1. 打瞌睡.做白日梦时.困乏时,大脑会发出α波,称为"醒态波",这个阶段,人的身体放松,呼吸和心率开始变慢,大脑变得放松,思维开始漫游 2. 人的脑波会经理"Sleep spindles"和"K-Complexes

ASP.NET Core 3.0:将会拥有更少的依赖

在ASP.NET Core项目中,我们使用一个叫做Microsoft.AspNetCore.App的综合包.它也被称为ASP.NET Core Shared Framework,在ASP.NET Core Shared Framework之中包含了很多依赖项,它能满足一般应用的需求.但是如果你查看它的依赖项,在ASP.NET Core3.0中它的需求在似乎变得宽松了. 当前版本的Microsoft.AspNetCore.App明确列出了150个依赖项,而7个月前的版本只需要144个.在这些包中,

冒泡排序的交换次数 (树状数组)

计算冒泡排序的交换次数: 逆序数概念:在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序 一个排列中所有逆序总数叫做这个排列的逆序数. 所以冒泡排序结束即是所有的逆序数为0 思路: 暴力:我们可以开一个vis[]数组记录 在遍历到第 i 位时,已经出现的值有哪些.然后遍历到 arr[i] (第i位的值),得到小于arr[i] 的出现个数(即 i<j && arr[i]<= arr[j]的个数) 然后再用当前长度 i 减去符合条件个数

JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记1

技术非常多.样例非常多,仅仅好慢慢学,慢慢实践.!如今学的这本书是[JavaScript实战----JavaScript.jQuery.HTML5.Node.js实例大全] 第 3 章 用 JavaScript 实现的照片展示 构建软件设计的方法有两种:一种是把软件做得非常easy以至于明显找不到缺陷.还有一种是把它 做得非常复杂以至于找不到明显的缺陷. --C.A.R.Hoare,1980 年图灵奖获得者 在这个自拍自恋的时代,照片是要展示的.在前面的章节里已经解说了事件的绑定.本章主要利用前