• 数据结构与算法-----冒泡排序


      冒泡排序的基本思想,就是相邻的两个数字进行比较,如果它们的顺序错误,就把它们交换过来。什么是顺序错误呢?比如我们按从大到小进行排列,那么应该是大的数在前面,小的数在后面,两个数如果是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));

       结果如下,排序没有问题

  • 相关阅读:
    仿pinterest实现瀑布流布局效果
    .NET执行cmd时,如何调试命令的执行效果
    在Sharepoint 2007 整合Discuz Nt论坛
    如何使用EWS获取邮件及其附件
    启明星win7桌面天气预报软件下载与使用方法(带时间)
    【helpdesk】启明星helpdesk7.0版本里,实现邮件提交功能介绍和原理
    微软.NET设计上的一个错误(从.NET1.14.0),不知道以后.NET会不会修复这个错误
    什么是Traceback Ping
    用ASP生成RSS以及讀取RSS
    [轉]訂單編號方式探討
  • 原文地址:https://www.cnblogs.com/SamWeb/p/7827475.html
Copyright © 2020-2023  润新知