说明

对数组进行 冒泡排序 算是比较简单的,冒泡排序也是容易理解的一种排序算法了,在面试的时候,很可能就会问到。

实现原理

数组中有 n 个数,比较每相邻两个数,如果前者大于后者,就把两个数交换位置;这样一来,第一轮就可以选出一个最大的数放在最后面;那么经过 n-1(数组的 length - 1) 轮,就完成了所有数的排序。

好的,我们先来实现找数组中的最大数,并把他放到数组最后。

var arr = [3,4,1,2];
// 遍历数组,次数就是arr.length - 1
for (var i = 0; i < arr.length - 1; i++) {// 如果前一个数 大于 后一个数 就交换两数位置if (arr[i] > arr[i + 1]) {var temp = arr[i];arr[i] = arr[i + 1];arr[i + 1] = temp;}
}
console.log(arr)  // [3, 1, 2, 4]

我们能找到数组中最大的数,放到最后,这样重复 arr.length - 1 次,便可以实现数组按从小到大的顺序排好了。

var arr = [3,4,1,2];
// 遍历数组,次数就是arr.length - 1
for (var j = 0; j < arr.length - 1; j++) {// 这里 i < arr.length - 1 ,要思考思考合适吗?我们下面继续说for (var i = 0; i < arr.length - 1; i++) {if (arr[i] > arr[i + 1]) {var temp = arr[i];arr[i] = arr[i + 1];arr[i + 1] = temp;}}
}
console.log(arr)  // [1,2,3,4]

虽然上面的代码已经实现冒泡排序了,但就像注释中提到的,内层 for 循环的次数写成,i < arr.length - 1 ,是不是合适呢?
我们想一下,当第一次,找到最大数,放到最后,那么下一次,遍历的时候,是不是就不能把最后一个数算上了呢?因为他就是最大的了,不会出现,前一个数比后一个数大,要交换位置的情况,所以内层 for 循环的次数,改成 i < arr.length - 1 -j ,才合适,看下面的代码。

var arr = [3, 4, 1, 2];
function bubbleSort (arr) {for (var j = 0; j < arr.length - 1; j++) {// 这里要根据外层for循环的 j,逐渐减少内层 for循环的次数for (var i = 0; i < arr.length - 1 - j; i++) {if (arr[i] > arr[i + 1]) {var temp = arr[i];arr[i] = arr[i + 1];arr[i + 1] = temp;}}}return arr;
}
bubbleSort(arr);

我们想下这个情况,当原数组是,
arr = [1,2,4,3];
在经过第一轮冒泡排序之后,数组就变成了
arr = [1,2,3,4];
此时,数组已经排序完成了,但是按上面的代码来看,数组还会继续排序,所以我们加一个标志位,如果某次循环完后,没有任何两数进行交换,就将标志位 设置为 true,表示排序完成,这样我们就可以减少不必要的排序,提高性能。

完整代码

var arr = [3, 4, 1, 2];
function bubbleSort (arr) {var max = arr.length - 1;for (var j = 0; j < max; j++) {// 声明一个变量,作为标志位var done = true;for (var i = 0; i < max - j; i++) {if (arr[i] > arr[i + 1]) {var temp = arr[i];arr[i] = arr[i + 1];arr[i + 1] = temp;done = false;}}if (done) {break;}}return arr;
}
bubbleSort(arr);

性能

时间复杂度: 平均时间复杂度O(n*n) 、最好情况O(n)、最差情况O(n*n)
空间复杂度: O(1)
稳定性: 稳定

时间复杂度指的是一个算法执行所耗费的时间
空间复杂度指运行完一个程序所需内存的大小
稳定指,如果a=b,a在b的前面,排序后a仍然在b的前面
不稳定指,如果a=b,a在b的前面,排序后可能会交换位置

总结

1、外层 for 循环控制循环次数
2、内层 for 循环进行两数交换,找每次的最大数,排到最后
3、设置一个标志位,减少不必要的循环

好的,下一篇文章,来实现下冒泡排序的可视化,把冒泡排序的过程展示出来。
JavaScript实现冒泡排序 可视化

[外链图片转存失败(img-t1ZmiyeS-1562659143812)(https://segmentfault.com/image?src=https://segmentfault.com/image?src=https://sfault-image.b0.upaiyun.com/343/822/34382280-59fd169be3467_articlex&objectId=1190000012067545&token=06b317d297940d516e5f823f3b52f86d&objectId=1190000013576616&token=adafa164f9a95036b3804823d4855833)]

JavaScript实现冒泡排序 1相关推荐

  1. JavaScript实现冒泡排序

    说明 对数组进行 冒泡排序 算是比较简单的,冒泡排序也是容易理解的一种排序算法了,在面试的时候,很可能就会问到. 实现原理 数组中有 n 个数,比较每相邻两个数,如果前者大于后者,就把两个数交换位置: ...

  2. JavaScript实现冒泡排序 可视化

    说明 上次写了 JavaScript实现冒泡排序 ,只是简单的说了冒泡排序算法是什么,怎么实现,这次来实现将冒泡排序的过程展现出来. 解释 先来个简单的版本,看效果图 实现这个效果,思路是这样的 1. ...

  3. JavaScript实现冒泡排序 可视化 1

    说明 上次写了 JavaScript实现冒泡排序 ,只是简单的说了冒泡排序算法是什么,怎么实现,这次来实现将冒泡排序的过程展现出来. 解释 先来个简单的版本,看效果图 实现这个效果,思路是这样的 1. ...

  4. JavaScript算法——冒泡排序

    一.概念 冒泡排序(Bubble Sort)也叫气泡排序.泡沫排序,是一种比较简单的排序算法. 它通过遍历数组,比较相邻的两个元素,如果前一个元素比后一个元素大,则交换它们的位置,这样第一次遍历后数组 ...

  5. 还是分不清JavaScript中冒泡排序与插入排序区别的看过来!!!

    冒泡排序 在冒泡排序的过程中,按照从小到大或从大到小的规则排序,不断地比较数组中相邻两个元素的值,较小或较大的元素前移,如下图所示: 从图可以看出,冒泡排序比较的次数是数组长度-1,每轮比较的对数 = ...

  6. JavaScript(JS)—冒泡排序

    原理:数组内相邻的两个元素两两比较,较小的放在前位,较大的放在后为,一次循环后,最小或最大的元素就会排在第一位,第二次循环也是如此,如此类推,知道所有元素排序完成. 描述: ①:比较相邻的元素.如果第 ...

  7. JavaScript实现十种经典排序算法(js排序算法)

    冒泡排序算法 冒泡排序(Bubble Sort)是一种简单直观的排序算法.冒泡排序算法的步骤描述如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一 ...

  8. 主流语言实现冒泡排序算法

    什么是冒泡排序 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小.首字母从Z到A)错误就把他们交 ...

  9. javascript算法汇总(持续更新中)

    1. 线性查找 1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset ...

最新文章

  1. curl 命令行下载工具使用方法小结
  2. linux中文件的编辑 写入 读取 光标的位置 以及相应的补充
  3. dede mysql x_认识Dede的mysql数据库结构功能
  4. 001_汽车之家,新浪和360之间的交流
  5. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (20) - IvyBridge微架构
  6. 力压华为小米!安兔兔1月安卓性能榜第一名是它!
  7. Simulink模块之VCO(压控振荡器)
  8. 2023年长安大学外国语言文学考研考情与难度及上岸前辈备考经验
  9. 安装系统出现Winload.exe错误0xc000000e解决方法
  10. 第二工业大学计算机应用大专录取分,2016年上海第二工业大学专科层次依法自主招生各专业分数线...
  11. el-table thead右侧留白问题
  12. 计算机力学专业排名,专业+排行榜
  13. Unity URP入门实战
  14. V2X-ViT:基于Vision Transformer的V2X协同感知
  15. linux下c语言调用mysql,Linux下C语言操作MYSQL总结
  16. 矩阵的特性和运算法则
  17. hdu 4287 sdnu 1119 Intelligent IME
  18. 解决RStudio Warning message:文件名、目录名或卷标语法不正确
  19. 【高数】不定积分之有理函数的积分
  20. 移动端的touch事件(touchstart、touchmove)以及如何取得滑过元素的id

热门文章

  1. TikTok小店门槛变化
  2. 游戏代理工作室,如何选择游戏平台?
  3. tp5项目实现QQ第三方登录
  4. dijkstra模板及例题(最短路算法)
  5. mysql workbench批量导出导入sql文件
  6. 实例4计算个人收入所得税(C语言实现)
  7. MySQL delete 语句
  8. Webdriver常用及基础方法
  9. 1039: n个数求和 Python
  10. ROS ANDROID