冒泡排序就这么简单

在我大一的时候自学c语言和数据结构,我当时就接触到了冒泡排序(当时使用的是C语言编写的)。现在大三了,想要在暑假找到一份实习的工作,又要回顾一下数据结构与算法的知识点了。

排序对我们来说是一点也不陌生了,当你打王者荣耀的时候也会有段位之分,当你打Dota的时候也有天梯分。从高往下数,这个排名是有规律的,就是一种排序。

我最开始接触的就是冒泡排序,所以这篇博文主要讲的是冒泡排序。

冒泡排序的实现

来源百度百科:

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

算法描述:

i从0开始,i与i+1比较,如果i>i+1,那么就互换

i不断增加,直到i

从最简单开始,首先我们创建一个数组,该数组有5位数字:

int[] arrays = {2, 5, 1, 3, 4};

一、第一趟排序

下面我们根据算法的描述来进行代码验算 (第一趟排序):

//使用临时变量,让两个数互换

int temp;

//第一位和第二位比

if (arrays[0] > arrays[1]) {

//交换

temp = arrays[0];

arrays[0] = arrays[1];

arrays[1] = temp;

}

//第二位和第三位比

if (arrays[1] > arrays[2]) {

temp = arrays[1];

arrays[1] = arrays[2];

arrays[2] = temp;

}

//第三位和第四位比

if (arrays[2] > arrays[3]) {

temp = arrays[2];

arrays[2] = arrays[3];

arrays[3] = temp;

}

//第四位和第五位比

if (arrays[3] > arrays[4]) {

temp = arrays[3];

arrays[3] = arrays[4];

arrays[4] = temp;

}

如果前一位的数比后一位的数要大,那么就交换,直到将数组的所有元素都比较了一遍!

经过我们第一趟比较,我们可以发现:最大的值就在数组的末尾了!

一、第二趟排序

第二趟排序跟第一趟排序一样,也是用前一位与后一位比较,如果前一位比后一位要大,那就交换。值得注意的是:并不需要与最后一位比较了,因为在第一趟排序完了,最后一位已经是最大的数了。同理,我们第二趟排序完了之后,倒数第二位也是第二大的数了。

第二趟排序的代码如下:

//第一位和第二位比

if (arrays[0] > arrays[1]) {

//交换

temp = arrays[0];

arrays[0] = arrays[1];

arrays[1] = temp;

}

//第二位和第三位比

if (arrays[1] > arrays[2]) {

temp = arrays[1];

arrays[1] = arrays[2];

arrays[2] = temp;

}

//第三位和第四位比

if (arrays[2] > arrays[3]) {

temp = arrays[2];

arrays[2] = arrays[3];

arrays[3] = temp;

}

//第四位不需要和第五位比了,因为在第一趟排序结束后,第五位是最大的了。

结果:我们的第二大数已经排在了倒数第二位了

三、代码简化

值得说明的是:上面的结果看起来已经是排序好的了,其实是我在测试时数据还不足够乱,如果数据足够乱的话,是需要4(n-1)趟排序的!

但我们从上面的代码就可以发现:第一趟和第二趟的比较、交换代码都是重复的,并且我们的比较都是写死的(0,1,2,3,4),并不通用!

我们的数组有5位数字

第一趟需要比较4次

第二趟需要比较3次

我们可以根据上面规律推断出:

第三趟需要比较2次

第四躺需要比较1次

再从上面的规律可以总结出:5位数的数组需要4躺排序的,每躺排序之后次数减1(因为前一趟已经把前一趟数的最大值确定下来了)!

于是我们可以根据for循环和变量将上面的代码进行简化:

int temp;

//外层循环是排序的趟数

for (int i = 0; i < arrays.length - 1 ; i++) {

//内层循环是当前趟数需要比较的次数

for (int j = 0; j < arrays.length - i - 1; j++) {

//前一位与后一位与前一位比较,如果前一位比后一位要大,那么交换

if (arrays[j] > arrays[j + 1]) {

temp = arrays[j];

arrays[j] = arrays[j + 1];

arrays[j + 1] = temp;

}

}

}

四、冒泡排序优化

从上面的例子我们可以看出来,如果数据足够乱的情况下是需要经过4躺比较才能将数组完整排好序。但是我们在第二躺比较后就已经得到排好序的数组了。

但是,我们的程序在第二趟排序后仍会执行第三趟、第四趟排序。这是没有必要的,因此我们可以对其进行优化一下:

如果在某躺排序中没有发生交换位置,那么我们可以认为该数组已经排好序了。

这也不难理解,因为我们每趟排序的目的就是将当前趟最大的数置换到对应的位置上,没有发生置换说明就已经排好序了。

代码如下:

//装载临时变量

int temp;

//记录是否发生了置换, 0 表示没有发生置换、 1 表示发生了置换

int isChange;

//外层循环是排序的趟数

for (int i = 0; i < arrays.length - 1; i++) {

//每比较一趟就重新初始化为0

isChange = 0;

//内层循环是当前趟数需要比较的次数

for (int j = 0; j < arrays.length - i - 1; j++) {

//前一位与后一位与前一位比较,如果前一位比后一位要大,那么交换

if (arrays[j] > arrays[j + 1]) {

temp = arrays[j];

arrays[j] = arrays[j + 1];

arrays[j + 1] = temp;

//如果进到这里面了,说明发生置换了

isChange = 1;

}

}

//如果比较完一趟没有发生置换,那么说明已经排好序了,不需要再执行下去了

if (isChange == 0) {

break;

}

}

五、扩展阅读

C语言实现第一种方式:

void bubble ( int arr[], int n)

{

int i;

int temp;

for (i = 0; i < n - 1; i++) {

if (arr[i] > arr[i + 1]) {

temp = arr[i];

arr[i] = arr[i + 1];

arr[i + 1] = temp;

}

}

}

void bubbleSort ( int arr[], int n)

{

int i;

for (i = n; i >= 1; i--) {

bubble(arr, i);

}

}

C语言实现第二种方式递归:

void bubble ( int arr[], int L, int R)

{

if (L == R) ;

else {

int i;

for (i = L; i <= R - 1; i++)//i只能到达R-1

if (arr[i] > arr[i + 1]) {

int temp = arr[i];

arr[i] = arr[i + 1];

arr[i + 1] = temp;

}

bubble(arr, L, R - 1);//第一轮已排好R

}

}

测试代码:

int main ()

{

int arr[] = {2, 3, 4, 511, 66, 777, 444, 555, 9999};

bubbleSort(arr, 8);

for (int i = 0; i < 9; i++)

cout << arr[i] << endl;

return 0;

}

5.1时间复杂度的理解:

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y

java顺序表冒泡排序_冒泡排序就这么简单 - Java3y的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. java选择排序不稳定_选择排序就这么简单 - Java3y的个人空间 - OSCHINA - 中文开源技术交流社区...

    选择排序就这么简单 从上一篇已经讲解了冒泡排序了,本章主要讲解的是选择排序,希望大家看完能够理解并手写出选择排序的代码,然后就通过面试了!如果我写得有错误的地方也请大家在评论下指出. 选择排序介绍和稳 ...

  2. java 全排列非递归算法_全排列的非递归算法 - osc_ivkc73ze的个人空间 - OSCHINA - 中文开源技术交流社区...

    1.全排列的定义和公式: 从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列.由排列的定义,显然不同的顺序是一个不同的排列.从n个元素中取m个元素 ...

  3. java拆分任意五位数_五位数拆分出各位 - osc_foo7glsg的个人空间 - OSCHINA - 中文开源技术交流社区...

    5.输入一个五位数,输出一个反转的五位数 输入->12345 输出->54321 //这是五位数字拆分方法. System.out.println("请输入五位数的数字:&quo ...

  4. ie对java的设置字体_关于IE6幽灵字体 - JavaSwing的个人空间 - OSCHINA - 中文开源技术交流社区...

    前言:今天做项目的时候在IE6下出现了这样的一种现像,这种情况只在IE6下出现,最后在网友的帮助下这个问题最终得到了解决.所以马上作了下笔记! 情况如下图: 我在网上找了点资料出现IE6下幽灵字体的情 ...

  5. java 滚动加载_滚动加载 - java-苦苦甜甜的个人空间 - OSCHINA - 中文开源技术交流社区...

    html代码如下: 滚动条距离底部 #parse("front/common/include.html") $(function () { var i = 4; $(window) ...

  6. C语言十个字母用冒泡法排序,冒泡排序法(C语言) - osc_wq8j2a9a的个人空间 - OSCHINA - 中文开源技术交流社区...

    常用的排序方法有冒泡排序法,选择排序法,插入排序法以及希尔排序法等.本文着重讲解如何利用C代码,实现冒泡排序. 首先,要了解什么是冒泡排序.冒泡排序是常用的一种排序方法,其基本方法就是逐次比较.即一次 ...

  7. java如何测试定时器_如何测试定时任务 - 邓竣的个人页面 - OSCHINA - 中文开源技术交流社区...

    系统一般会有一些后台定时任务,假设我们使用quartz实现定时任务,那么有两个测试功能点: 定时任务逻辑是否正确 定时器cron表达式编写是否正确,触发时间点是否正确 定时任务逻辑测试 如果定时任务在 ...

  8. Java位语句_卫语句 - 宿小帅的个人空间 - OSCHINA - 中文开源技术交流社区

    1.使用卫语句取代嵌套表达式 函数中的条件逻辑使人难以看清正常的执行途径.使用卫语句表现所有特殊情况. 动机:条件表达式通常有2种表现形式.第一:所有分支都属于正常行为.第二:条件表达式提供的答案中只 ...

  9. Java实现数组列项相加_裂项求和法 - osc_rkun22vq的个人空间 - OSCHINA - 中文开源技术交流社区...

    常用公式 常用式:$\cfrac{1}{n(n+1)}=\cfrac{1}{n}-\cfrac{1}{n+1}$:推广式:$\cfrac{1}{n(n+k)}=\cfrac{1}{k}(\cfrac{ ...

最新文章

  1. Windbg 脚本命令简介
  2. LIVE555再学习 -- Linux 下编译
  3. 聚数引智,承德大数据产业对接交流会将于2019中国国际数字经济博览会期间召开...
  4. 发布python项目到pypi,以便供他人用pip install安装
  5. pytorch nn.CrossEntropyLoss
  6. matplotlib 28原则
  7. Oracle 创建表空间借鉴 保留,占版权留言告知
  8. C#中如何获取一个二维数组的两维长度,即行数和列数?
  9. 使用Xshell连接Linux虚拟机
  10. Discuz!如何实现为版块设定自定义logo,实现不同的版块不同的logo!
  11. mt7620a上wifi中继的实现
  12. 半导体器件物理【6】固体量子——各种电子有效质量 + 状态密度函数
  13. linux编译gdal geos,GDAL编译支持GEOS
  14. SpringBoot内置servlet容器分析
  15. 艾肯micu声卡调试安装教程
  16. “蓝凤凰”开网店,卖起了这么多高颜值又神奇的生物
  17. 1688-seller_info - 获得店铺详情
  18. 回溯法之活动安排问题
  19. python3 正则匹配特殊符号_Python3 正则表达式特殊符号及用法(详细列表)
  20. python在线编译器简单实现

热门文章

  1. python及pycharm
  2. 手机怎么能把书签导出来_成人高考能在手机上报名吗?成人高考怎么缴费?
  3. Java中从String到Long的转换
  4. 线程池是如何执行的?拒绝策略有哪些?
  5. 图解:为什么非公平锁的性能更高?
  6. 最牛逼的 Java 项目实战,没有之一!
  7. 算法图解:如何判断括号是否有效?
  8. WebStorm按Tab建快速生成代码模块
  9. npm上传自己的项目
  10. 关于二维数组取地址加以或减一解引用问题