迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 算法 >

排序算法学习之路——冒泡排序

作者:迹忆 最近更新:2022/11/19 浏览次数:

冒泡排序也是一种简单直观的排序算法。其思想是:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

下面我们通过一个简单的图例来了解一下这个冒泡的过程

起始位置为0,依次比较相邻的两个元素。如果前面的元素大于后面的元素,则进行交换。

我们可以看出,待排序序列有多少个元素,就需要几趟冒泡。但是在实际过程中,我们可以根据实际情况减少其冒泡的趟数。

就拿上例来说,我们看在第四趟冒泡完成以后就已经有序了。第五趟和第六趟冒泡过程并没有产生元素的交换。所以说我们可以判断,在一趟冒泡中如果没有产生元素的交换,我们就终止冒泡的整个过程。这样最后得到的序列同样是有序的。

反应在程序中就是在每一趟冒泡的开始设置一个标志位,默认为false。当有交换产生的时候将该标志位设为true。在该趟冒泡过程结束以后,我们根据此标志位来判断是否有交换的产生。如果没有交换产生的话,我们就直接结束整个冒泡过程。否则继续下一趟冒泡。

根据上图,我们来看一下实现冒泡排序的文字的步骤

1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3)针对所有的元素重复以上的步骤,除了最后一个。
4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

最后我们要将文字步骤转换成代码实现

/**
 * 交换函数
 */
function swap(&$arr,$a,$b){
    $t = $arr[$a];
    $arr[$a] = $arr[$b];
    $arr[$b] = $t;
}
function BubbleSort(&$arr){
    $end = count($arr)-1;
    while($end>0){
        for($i=0;$i<$end;$i++){
            if($arr[$i]>$arr[$i+1]){
                swap($arr,$i,$i+1);
            }
        }
        $end--;
    }
}
$arr = array(10,6,8,23,4,1,17,56,32,50,11,9);
BubbleSort($arr);
print_r($arr);

上述代码是将所有的冒泡过程都走了一遍,下面我们只需要将BubbleSort函数进行简单的修改就可以实现上述我们说的标志位来判断是否有交换的产生。

function BubbleSort(&$arr){
    $end = count($arr)-1;
    while($end>0){
        $flag = false;  //每次冒泡前 初始化标志位为false
        for($i=0;$i<$end;$i++){
            if($arr[$i]>$arr[$i+1]){
                swap($arr,$i,$i+1);
                $flag = true;  //有交换产生 将标志位置为true
            }
        }
        if(!$flag) break;  //如果没有交换产生 则直接跳出循环
        $end--;
    }
}

其实带标志位的和不带标志位的程序在数据量很小的时候并没有明显的差别,所用时间应该没有什么差别。但是在数据量很大的时候其差别就会变得很明显。但是话又说回来,冒泡排序并不是最好的排序算法,其效率较其他的排序算法低,时间复杂度为O(n²)。所以说在实际情况中如果数据量很大的话也不一定我们会选择冒泡排序来实现排序。

但是我个人觉得冒泡排序和选择排序可以说是其他排序的基础,所以我们有必要去了解冒泡排序。

希望本文对大家有所帮助。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Java 中的选择排序算法

发布时间:2023/10/17 浏览次数:153 分类:Java

本教程演示了 Java 中的选择排序算法。选择排序是首先选择列表或数组中最小的元素并与第一个元素或数组交换的方法;然后,第二个缩小的元素与第二个元素交换。

Java 基数排序算法

发布时间:2023/10/17 浏览次数:206 分类:Java

本教程详细解释了基数排序算法并演示了 Java 中的实现。在基数排序算法中,元素的排序首先将具有相同位值的单个数字分组,然后按照升序或降序排序。本教程详细解释了基数排序算法,并演

C++ 中最快的排序算法

发布时间:2023/08/31 浏览次数:164 分类:C++

本文将解释哪种排序算法在什么条件下表现最好。 条件包括数据结构的类型、排序数据的大小、数据排列和数据元素的范围。

Java最快的排序算法

发布时间:2023/07/16 浏览次数:164 分类:Java

本文将介绍两种最快的排序算法并用 Java 编写它们的代码。第一种技术是计数排序,它有一些局限性。 因此,我们还将介绍合并排序算法。 Java中的计数排序算法 Java中的归并排序算法

使用 PHP MySQLi 函数获取最后插入的 ID

发布时间:2023/05/09 浏览次数:102 分类:MySQL

本篇文章简要介绍了 PHP mysqli() 函数并演示了如何使用它从 MySQL 数据库中获取最后插入的 ID。它是一个名为 mysqli 的 MySQL 驱动程序扩展版本,

在 PHP 中使用 MongoDB 作为文件存储

发布时间:2023/04/20 浏览次数:143 分类:MongoDB

在为大文件创建可扩展存储方面,MongoDB 及其 GridFS(使用 MongoDB 查询语言 - MQL 编写)是市场上最好的文件存储解决方案之一。 在本教程中,您将学习如何在 PHP 中使用 MongoDB 作为文件存储。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便