冒泡排序的基本思想,就是相邻的两个数字进行比较,如果它们的顺序错误,就把它们交换过来。什么是顺序错误呢?比如我们按从大到小进行排列,那么应该是大的数在前面,小的数在后面,两个数如果是45,98这么排列,它们就是顺序错误,我们就要把它们交换过来,变为45,98;

  现在我们就按照上面的基本思想,对5个数12, 35, 99, 8, 100进行降序排列。

    1, 首先比较第1个数和第2个数:12,35,由于是降序排列,越小的数应该越在后面, 而在这里12 比35小,却排在了前面, 不符合要求,就是顺序错误,我们要把它们交换过来,经过交换之后,变成了 35, 12, 99, 8, 100;

    2, 现在再比较第2个数和第3个数: 12,99,由于12 还是小于99, 确排在前面,我们仍要调换它们的位置, 调换之后为35, 99, 12, 8, 100;

    3, 再比较第3个数和第4个数; 12, 8: 12 > 8 , 符合小的在后面的原则,不用调换位置。

    4, 最后比较第4个数和第5个数: 8 和100, 调换它们的位置 35, 99, 12, 100, 8;

  经过这4次比较,我们把最小的数字8找出来了,并放到了最后。但是仅仅找出了一个最小的数。我们还是需要进行排序,还是要按照上面的两两比较方法,

  现在再进行一次排序:

    1,比较第1个数和第2个数:35, 99, 由于35 < 99, 不符合越小的数越在后面的原则,所以交换它们的位置: 99, 35, 12, 100, 8;

    2, 比较第2个和第3个数:35,12; 可以看到,它们不用交换位置

    3, 比较第3个数和第4个数: 12, 100,需要交换它们的位置 99, 35, 100, 12, 8;

  注意,这里就不用再去比较第4位和第5位数了,因为在上面的第一次比较中,8已经是最小的数了。

  这里只经过3个比较,找出的第二小的数。

  接着进行排序, 还是要两两比较,找出第三小的数

    1, 比较第1个数和第2个数: 99,35, 不需要交换它们的位置。

    2, 再比较第2个数和第3个数: 35, 100, 需要交换它们的位置 99,100, 35,12,8

  经过2个比较,我们找出了第3小的数,35;

  还是需要进行一个比较,找出第4小的数字,

    只需要比较第1个数和第2个数, 99,100,交换它们的位置。100,99,35, 12, 8

  这里只需要比较1次,就可以完成任务了。

    最终排序完成。100,99,35, 12, 8

  上面的排序过程,我们发现大的比较,一共发生了四次,每一次,我们称之为一趟。而每一趟只确定一个数进行归位。

  现在对上面的过程进行抽象一下: 我们一共5个数,共进行了4趟比较, 也就是说,如果我们有n个数, 我们要经历n-1趟比较。现在再看每一趟中的内部比较。

    在第一趟中,我们经过了4次比较,在第二趟中,我们经过了3次比较,

    在第三趟中,我们经过了2次比较,在第四趟中,我们经过了1次比较

  可以发现 趟数 + 比较次数 = 总共的个数。我们确定了趟数i, 用总数n 减去趟数就可以了。

  现在就可以用程序写一下。由于每次都是两两比较,所以我们要确定一个变量i, 比较完一次后,让它自动加1,以便进行下次比较,这就是循环。当然我们还要确定多少个数字,以便确认比较多少次。长度加上循环, 用数组是最好不过的了。

function bubbleSort (arr) {let newArray = arr.slice();   // 函数式编程的思想,不要对外部的变量进行改变。let n = newArray.length;      // 数组的长度,从而确定比较多少趟// 冒泡排序核心,首先要比较n- 1趟,因为每一趟只能确定一个数字for(let i = 0; i< n -1; i++) {for(let j =0; j< n - i; j++) {// 每一趟内部进行两两比较,而比较的次数就是 n -i // 如果顺序错误,就交换它们的位置if(newArray[j] < newArray[j + 1]) {let temp = newArray[j];newArray[j] = newArray[j+1];newArray[j+1] = temp;}}}return newArray;
}

  把 我们上面排序的5个数放入数组中,然后传入到bubbleSort 函数中

  let array = [12, 35, 99, 8, 100];console.log("排序前的数组:" + array);console.log("排序后的数组:" +bubbleSort(array));

   结果如下,排序没有问题

转载于:https://www.cnblogs.com/SamWeb/p/7827475.html

数据结构与算法-----冒泡排序相关推荐

  1. JS数据结构与算法——冒泡排序(把大的数字依次往后放)

    一.图解排序过程 注意:比较次数和交换次数之所以不一致,是因为:比较了并不一定就需要交换两个数字的位置,比如比较 1 和 2两个数字,由于 后者本身就比前者大,所以不需要交换两者的位置. 二.代码实现 ...

  2. 数据结构--排序算法(冒泡排序)

    一.原理 冒泡排序是最简单的排序算法,两层遍历,外部循环从第一个元素开始遍历到倒数第二个,内部循环从最后一个元素遍历到外部循环的下一个元素,内部循环比较当前元素和前一个位置的元素,如果当前元素大,则交 ...

  3. Java数据结构与算法——冒泡排序

    1.关于排序 排序也称排序算法 (Sort Algorithm),排序是将一 组数据,依指定的顺序进行排列 的过程. 排序的分类: 内部排序:  指将需要处理的所有数据都加载 到内部存储器中进行排序. ...

  4. 数据结构与算法 / 冒泡排序及其优化的三种方式

    一.一般写法 统一使用交换函数: void swap(int& a, int& b) {int tmp = a;a = b;b = tmp;return; } void BubbleS ...

  5. 数据结构与算法 / 冒泡排序最坏情况下的时间复杂度解析

    冒泡排序是一种用时间换空间的排序方法,最坏情况是把顺序的排列变成逆序,或者把逆序的数列变成顺序.在这种情况下,每一次比较都需要进行交换运算. 举个例子来说,一个数列 5 4 3 2 1 进行冒泡升序排 ...

  6. 冒泡排序java代码_数据结构与算法—冒泡排序(Java实现)

    [toc] 冒泡排序 程序代码 package com.uplooking.bigdata.datastructure; import java.util.Arrays; public class B ...

  7. java冒泡测试代码_数据结构与算法—冒泡排序(Java实现)

    [toc] 冒泡排序 程序代码package com.uplooking.bigdata.datastructure;import java.util.Arrays;public class Bubb ...

  8. 数据结构与算法——冒泡排序(改进后)

    //改进的冒泡程序 #include<stdio.h> void BubbleSort(int arr[], int length); int main( ) { int i; int a ...

  9. Java 数据结构与算法系列之冒泡排序

    一.前言 相信大部分同学都已经学过数据结构与算法这门课了,并且我们可能都会发现一个现象就是我们所学过的数据结构与算法类的书籍基本都是使用 C 语言来写的,好像没见过使用 Java 写的数据结构与算法. ...

最新文章

  1. jquery总结和注意事项
  2. MATLAB中rand,randi,randn函数,及rand('state',0)和rand('seed',0)产生随机种子详解
  3. Java中的string定义的两种方法和区别
  4. 《编码规范和测试方法——C/C++版》学习笔记 ·002
  5. oracle高效分页存储过程(百万数据级)
  6. 最小二乘法 几何意义
  7. core java购买_Core Java =
  8. java葫芦娃喜羊羊格斗_课内资源 - 基于JAVA的葫芦娃大战妖怪
  9. 树莓派无法解析域名(即无法连网,更新软件失败)
  10. vcode去除分号和双引号方法
  11. __builtin_ffs 实现原理
  12. Data-driven methods for solving algebra word problems论文阅读
  13. 如何用Ps用高斯模糊
  14. LaTex:实现在Springer可以使用bibtex自动生成引用文献,而不用写Bibitem
  15. 超声波测距仪编程_关于基于51单片机的超声波测距仪的汇编编程问题
  16. 智慧工地车辆冲洗系统 工地渣土车未冲洗自动抓拍 yolo
  17. Lua ipairs、pairs
  18. 投资入门第 3 步:技术分析法(常用技术分析)
  19. 如何建立高质量团队-《克服团队协作的五种障碍》笔记与心得
  20. NLP16-总结之一[dict,tfidf,word2vec,关键词,simhash]

热门文章

  1. 我的Thinkpad T410最近老是出Fan error
  2. oracle 德部分操作笔记(自己用的)
  3. 公司要禁止QQ?【我们从协议开始分析】
  4. 跨数据库调用存储过程权限问题
  5. springboot的IOC依赖注入与控制反转-举例(转载+自己整理)
  6. check your cluster UI to ensure that workers are registered and have sufficient resources
  7. Couldn‘t find grammar element for class javax.ws.rs.core.Response
  8. django按钮点击后想刷新当前页面的view写法
  9. kaggle notebook在git push时附带用户民和密码(一行搞定,全部写在一行中)
  10. C++编程思想:继承与虚函数以及多态