学以致用之冒泡排序

本文深入剖析冒泡排序算法,揭示其核心思想及代码实现原理,帮助初学者真正理解并灵活应用冒泡排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

冒泡排序是一种看起来很简单的交换排序,尤其是其易记的特点,促使很多初学者只是简单地记住冒泡排序的某种代码实现,而忽略了对其更深层次的理解,本文旨在通过对冒泡排序的解析来帮助初学者真正理解冒泡排序的代码实现原理,如果你能在阅读完本文后不参考任何代码随手实现一种冒泡排序,那么这篇文章的目的便达到了。

下面是两段不同的冒泡排序实现代码,如下:

public void bubbleSort(int[] arrs){
    for(int i=0; i<arrs.length-1; i++){
        for(int j=0; j<arrs.length-1-i; j++){
            if(arrs[j]>arrs[j+1]){
                int temp = arrs[j];
                arrs[j] = arrs[j+1];
                arrs[j+1] = temp;
            }
        }
    }
}
public void bubbleSort(int[] arrs){
    for(int i=0; i<arrs.length-1; i++){
        for(int j=arrs.length-1; j>i; j--){
            if(arrs[j]<arrs[j-1]){
                int temp = arrs[j];
                arrs[j] = arrs[j-1];
                arrs[j-1] = temp;
            }
        }
    }
}

在继续往下阅读之前,请先暂缓几分钟,有必要先确保自己是否真的在思考两段代码的不同之处,而不是把注意力停留在代码的表象上。
显然上面两段代码都比较容易读懂,但是我们的追求不再是停留在“读”这个层次,而是应该具备去“写”任何一种可能的冒泡排序实现乃至一种与冒泡排序类似但是从未见过的算法的实现代码,那时死记硬背这种方式显然不会帮助我们太多。

好吧,现在你应该已经意识到理解算法代码实现原理的重要性,接下来正式进入我们的主题。

通过阅读上面两段冒泡排序的实现代码,不难发现两段代码中都有类似的for循环嵌套以及都要进行元素的交换这一过程,那么是不是意味着冒泡排序的实现必须要依赖for循环和适当的时候交换数组中的相邻元素呢,这个问题不难回答,作为一种交换排序,交换是永远无法回避的问题,但是for循环却并不是循环中唯一的选择,重点不在于选择了何种循环,而在于选择了循环,我们试图去看清冒泡排序的实现中真正必要的那些东西,而不是代码中展现在我们面前的那些表象。

现在回想一下冒泡排序的思想,事实上冒泡排序一直在做着相同的事情,总是试图把剩下的元素中最大或最小的那个元素移动到数组元素遍历方向所指向的那一端,但又不得不做些什么去保障之前的劳动成果不会被自己破坏。

上面的冒泡排序的思想中有两处需要重点关注的地方:

  • 目标元素的移动方向应该与元素被遍历的方向保持一致

  • 有且仅保证所有已排完序的目标元素不再参与排序

那么,冒泡排序的代码实现中又是如何去完成自身职责的呢,这才是本文的重点,那么应该先考虑上面两个关注点所带来的问题:

  • 是什么在控制目标元素的移动方向?

  • 如何在本轮排序中排除那些已经排完序的目标元素?

请仔细思考这两个问题,可能读到这里你已经有种豁然开朗的感觉,那么你可以选择不再继续往下阅读,去实践一下自己刚刚注意到的一些东西也是一个很好的选择。

对于第一个问题,答案就在下面两段代码的不同之处:

if(arrs[j]>arrs[j+1]){
    ...
}
if(arrs[j]<arrs[j-1]){
    ...
}

没错,目标元素的移动方向取决于你正在操作当前元素与上一个还是下一个元素进行比较,至于什么时候交换元素并不会影响元素的移动方向,只会决定元素的排序方式,是从小到大还是从大到小进行排序。

对于第二个问题,答案也很简单,其实正是外层for循环和内层for循环的循环条件协作的功劳,这也正是外层for循环唯一的职责。

未完待续。

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值