死磕算法之冒泡排序

学习更多算法系列请参考文章:死磕算法之汇总篇

冒泡排序在排序算法中效率算最慢的一类了,但是因为它简单的缘故仍然是工作1-3年的程序员面试经常会碰到的算法问题,今天就来给大家分析一下冒泡排序的排序流程。

假如我们现在要排序的数组为[3,1,0,2,8,4,2]那么我们第一轮排序为

  1. 比较3和1,发现3比1大,那么我们就交换3和1,数组变成了[1,3,0,2,8,4,2]
  2. 比较3和0,发现3比0大,那么我们就交换3和0,数组变成了[1,0,3,2,8,4,2]
  3. 比较3和2,发现3比2大,那么我们就交换3和2,数组变成了[1,0,2,3,8,4,2]
  4. 比较3和8,发现3没有8大,那么不操作,数组还是[1,0,2,3,8,4,2]
  5. 比较8和4,发现8比4大,那么我们就交换8和4,数组变成了[1,0,2,3,4,8,2]
  6. 比较8和2,发现8比2大,那么我们就交换8和2,数组变成了[1,0,2,3,4,2,8]

现在第一轮的排序已经完成了,我们就筛选出来了最大值8,此时数字8已经在数组最后的位置了,下一轮排序我们就可以排除它了。

第二轮排序为:

  1. 比较1和0,发现1比0大,那么我们就交换1和0,数组变成了[0,1,2,3,4,2,8]
  2. 比较1和2,发现1没有2大,那么不操作,数组还是[0,1,2,3,4,2,8]
  3. 比较2和3,发现2没有3大,那么不操作,数组还是[0,1,2,3,4,2,8]
  4. 比较3和4,发现3没有4大,那么不操作,数组还是[0,1,2,3,4,2,8]
  5. 比较4和2,发现4比2大,那么我们就交换4和2,数组变成了[0,1,2,3,2,4,8]

现在第二轮排序完成了,数组最后的4和8是不是已经有序了呢。

聪明的你是不是已经发现了冒泡排序的规律了呢,那么你能用代码去手写一下实现么?

int []a=new int[]{3,1,0,2,8,4,2};
int i,j;
int flag;                 // 标记
for (i=a.length-1; i>0; i--) {
    flag = 0;            // 初始化标记为0
    // 将a[0...i]中最大的数据放在末尾
    for (j=0; j<i; j++) {
        if (a[j] > a[j+1]) {
            // 交换a[j]和a[j+1]
            int tmp = a[j];
            a[j] = a[j+1];
            a[j+1] = tmp;
            flag = 1;    // 若发生交换,则设标记为1
        }
    }

    if (flag==0)
        break;            // 若没发生交换,则说明数列已有序。
}
for (int ii:a){
    System.out.print(ii+",");
}

上方代码就是我们冒泡排序的一个简单实现了。你手写的是不是比我的更强呢。

上方的代码还有一个flag我们没有说到,不知道你注意到了么,本身待排序的数组是需要数组长度-1大轮排序才能得出结果,但是我们这个数组在第三轮排序完成后就已经有序了,第四轮的时候其实内层的循环是没有进去的,那么我们是不是可以得出结论,既然第四轮没有进行排序那么再后面的排序是不是也不需要了,所以我们使用了一个flag标记来避免多余的操作。

一个简单的冒泡排序讲完了。在这里温馨提示大家,学习算法时,我们没必要拘泥于代码的实现,那没有意义。我的建议就是深入理解步骤,当你理解步骤以后代码是随你怎么玩都可以的。

原文地址:https://www.cnblogs.com/zhixiang-org-cn/p/9245669.html

时间: 2024-07-31 09:44:09

死磕算法之冒泡排序的相关文章

死磕算法之汇总篇

死磕算法之二分查找法 死磕算法之选择排序 死磕算法之插入排序 死磕算法之快速排序 死磕算法之堆排序 死磕算法之希尔排序 死磕算法之冒泡排序 持续更新中............ 原文地址:https://www.cnblogs.com/zhixiang-org-cn/p/9248986.html

死磕算法之希尔排序

学习更多算法系列请参考文章:死磕算法之汇总篇 今天讲一下希尔排序,希尔排序呢,其实可以理解为插入算法排序的一个升级版了,不了解插入排序的小伙伴可以先看一下这篇文章:死磕算法之插入排序 我们知道,插入排序在进行排序时如果当数据量很大的时候,有一个很小的数据出现在了数组的最后,那么我们就要移动了这个数据前面所有的元素给它放置到合适的元素.例如: 我们要排序的数组为[1,2,3,4,5,6,7,...此处省略一百万...,0].详细大家肯定不喜欢这个0往前移动一百万此吧. 希尔排序的出现其实就是为了解

死磕算法之堆排序

学习更多算法系列请参考文章:死磕算法之汇总篇 堆排序主要是运用了二叉树的性质来进行的排序. 在进行堆排序之前我们先了解一下二叉树的几个性质: 1.在排序使用二叉树的时候我们要排序的数组的第0个位置其实是不可以用的,这个时候如果我们要排序的数组为[3,1,0,2,8,4,2]时,我们首先要把它变为[0,3,1,0,2,8,4,2],我们把他转换为二叉树的时候是这样的 2.观察此二叉树我们可以发现几个公式: 父节点个数:(数组长度-1)/2 父节点索引为1到父节点个数 子节点的索引:左儿子为父节点索

死磕算法之插入排序

学习更多算法系列请参考文章:死磕算法之汇总篇 相信大家都有打扑克的经历,那么我们今天的插入排序就以拿牌为例开始讲(注意只是举例,不是按打牌的规则哦) 1.我们拿到了一张牌3,我们把它放手里,现在手里有牌[3] 2.我们拿到了一张牌1,拿它与手里最后一张牌也就是3比较,发现1比3小,所以我们把它插入到3的前面,现在手里有牌[1,3] 3.我们拿到了一张牌0,拿它与手里最后一张牌也就是3比较,发现0比3小,所以我们把它插入到3的前面,接着与3的上一张比较发现0比1还小,那么就把0在插入到1的前面,现

死磕算法之快速排序

学习更多算法系列请参考文章:死磕算法之汇总篇 快速排序是一个运用了分治法和递归算法的排序方式. 假如我们现在要排序的数组为[3,1,0,2,8,4,2].那么在进行快速排序的时候我们先要进行一些准备: n作为一个数组中的标杆,一趟排序过后我们要把数组中所有大于n的数放在它的右边,所有小于n的放在它的左边.一般情况下我们会取数组第一个元素作为n,在此数组中就是n=3 i我们使用i来找数组中大于标杆的值,i初始指向数组第一个位置 j我们使用j来找数组中小于标杆的值,j初始指向数组最后一个位置 下面开

死磕算法之二分查找法

学习更多算法系列请参考文章:死磕算法之汇总篇 二分查找又称折半算法,此算法作为一个经典的查找算法是我们不得不掌握的算法 这个算法查找的前提是查找的数据是有序的,我们以数组为例,使用二分查找法进行查找的时候我们应该先定义三个字段: 1.left指向数组第一个数据 2.right指向数组最后一个元素 3.mid呢指向(left+right)/2位置的元素,就是他们中间的位置. 当我们要在一个数组中查找一条数据a时,有这么几个步骤: 首先我们拿a与mid比较,如果a与mid相等那么我们就成功找到了这个

死磕Spring AOP系列5:设计模式在AOP中的使用

死磕Spring AOP系列3:剖析Bean处理器之DefaultAdvisorAutoProxyCreator 死磕Spring AOP系列2:剖析Bean处理器之BeanNameAutoProxyCreator 死磕Spring AOP系列1:编程式实现AOP 死磕Spring AOP系列4:剖析AOP schema方式原理 通过前面的死磕,应该对AOP的原理都掌握了.annotation配置AOP,再没有讲的必要了.annotation和xml schema两种方式,仅仅是声明方式不同而已

死磕 java同步系列之redis分布式锁进化史

问题 (1)redis如何实现分布式锁? (2)redis分布式锁有哪些优点? (3)redis分布式锁有哪些缺点? (4)redis实现分布式锁有没有现成的轮子可以使用? 简介 Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 本章我们将介绍如何基于redis实现分布式锁,并把其实现的进化史从头到尾讲明白,以便大家在面试的时候能讲清楚

2015考研数学考前必须死磕的知识点

2015考研数学考前必须死磕的知识点 来源:跨考教育    划词:关闭划词   收藏 编辑点评:下文为2015年考研数学必须掌握的知识点的大汇总,供考生们参考.沪江考研为你及时整合各路干货复习资料,敬请关注. 第一章 函数.极限与连续 1.函数的有界性 2.极限的定义(数列.函数) 3.极限的性质(有界性.保号性) 4.极限的计算(重点)(四则运算.等价无穷小替换.洛必达法则.泰勒公式.重要极限.单侧极限.夹逼定理及定积分定义.单调有界必有极限定理) 5.函数的连续性 6.间断点的类型 7.渐近