在总结冒泡排序前:先从头开始,对冒泡排序(BubbleSort)进行一个系统性了解:

冒泡排序法,又称交换排序法,是从观察水中的气泡变化构思而成的,原理是从第一个元素开始,比较相邻元素的大小,如果大小顺序不对,则进行两个数据的调换,就好像气泡从水中逐渐上升到水面上一样。经过这样的扫描,就可以一次接着一次的排序,直到完成所有元素的排序工作。

如图对数据进行排序 55,23,87,62,16:

通过代码的方式进行表达:

//冒泡排序法
#include<stdio.h>
#include<stdlib.h>
void Swap(int array[],int index1,int index2)//定义交换函数
{int temp = array[index1];array[index1] = array[index2];array[index2] = temp;
}
void Bubble_sort(int array[], int n)//定义排序函数
{int i = 0;int j = 0;int temp;for (i = 0; i < n-1;i ++){//与除自己以外的其他9个元素进行比较,for (j = 0; j < n - 1 - i; j++)//n-1-i的意思是每比较一趟元素就会少一个,比如说如果是执行的第三趟,那么元素的个数就是:10-1-3=6个{if (array[j] > array[j+1])//升序排法,如果前面的数大于后面的数,即调换位置{Swap(array,j,j+1);}}}
}
int main(){int array[10];int i;printf("请输入10个数\n");for (i = 0; i < 10; i++){        //接收用户的数值scanf("%d", &array[i]);}printf("排序前的各元素是:");for (i = 0; i < 10; i++){printf("%d ", array[i]);}printf("\n经过冒泡排序后的数组是:");Bubble_sort(array, 10);for (i = 0; i < 10; i++){printf("%d ", array[i]);}return 0;
}

如图,我输入十个数据:10,9,8,7,6,5,4,3,2,1

输出完成

如图,从程序的执行结果来,冒泡排序已经执行完毕,并且把数组中的十个元素从小到大排序了出来。

补充:数组作为函数形参时退化为指针,那么我们对代码进行修改。

void Bubble_sort(int *array, int len)//定义排序函数
{assert(array != NULL && len >= 0);//断言指针不为空指针,数组的长度大于等于0int i = 0;int j = 0;int temp;for (i = 0; i < len - 1;i ++){//与除自己以外的其他9个元素进行比较,for (j = 0; j < len - 1 - i; j++)//n-1-i的意思是每比较一趟元素就会少一个,比如说如果是执行的第三趟,那么元素的个数就是:10-1-3=6个{if (array[j] > array[j+1])//升序排法,如果前面的数大于后面的数,即调换位置{Swap(array,j,j+1);}}}
}

如图我输入十个数字被数组接收,然后排序:

输出完成

在这里我重新使用while循环重写冒泡排序函数,将打印外置为函数,并将原来的数据由用户输入改为系统自动随机生成12个小于等于20的数然后进行排序:

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<assert.h>
#include<time.h>
#define MAXSIZE 12
void initar(int *ar,int len)
{assert(ar != nullptr);for(int i = 0;i < len;i++){ar[i] = rand() % 20;}
}
void showar(int *ar,int len)
{assert(ar != nullptr);for(int i = 0;i < len;i++){printf("%d ",ar[i]);}printf("\n--------------------------\n");
}
void swap(int *ar,int index1,int index2)
{assert(ar != nullptr);int temp = ar[index1];ar[index1] = ar[index2];ar[index2] = temp;
}
void Bubble_sort(int *ar,int len)
{while(len--){for(int i = 0;i < len;i++){if(ar[i] > ar[i + 1]){swap(ar,i,i + 1);}}}
}
int main()
{srand((unsigned int)time(NULL));int ar[MAXSIZE];initar(ar,MAXSIZE);printf("原始数据为:\n");showar(ar,MAXSIZE);printf("排序后的数据为:\n");Bubble_sort(ar,MAXSIZE);showar(ar,MAXSIZE);return 0;
}

随机生成12个数,如图为运行结果:

这里,我对代码进行优化,以减少检查的趟数,定义一个标签flag,把它放在while循环里面,参与循环的条件,当程序只走到while循环里面时flag = 0,当程序走到了交换元素这里,flag = 1;这样做的优点是,如果提前几趟已经排序好,flag值为0,那么len下标就不用一直挪动直到len = ar(数组首元素地址),优化后的代码为:

void Bubble_sort(int *ar,int len)
{int flag = 1;while(len-- && flag){flag = 0;for(int i = 0;i < len;i++){if(ar[i] > ar[i + 1]){flag = 1;swap(ar,i,i + 1);}}}
}

优化后的冒泡排序比优化前的冒泡排序效率高的原因是:当序列在找到所有的最大值之前就已经将序列排好序,直接结束掉函数。

补充:自定义函数sizeof的用法:

在数组中,我如果先开始定义数组为:

int array[] = {1,2,3,4,5,6,7,8,9,10};

可以直观的看到,数组的元素个数是10个,我们可以通过sizeof函数来获取到数组元素的个数:

sizeof(array) / sizeof(array[0]);

在此处,sizeof(array)的意思是,整个array数组占据的存储单元数;

sizeof(array[0])的意思是第一个数组元素暂时占据的存储单元数,等同于每个数组元素暂时占据的存储单元数;

所以,整个数组占据的存储单元数比上每个数组元素暂居的存储单元数就是整个数组的元素个数。

算法 - 冒泡排序(Bubble_ Sort)相关推荐

  1. 经典排序算法 - 冒泡排序Bubble sort

    经典排序算法 - 冒泡排序Bubble sort 其原理是比较接近的数字22,按照从小到交换大或降序排列, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头開始进行两两比較交换,直到倒 ...

  2. 排序算法——冒泡排序(Bubble Sort)

    排序算法--冒泡排序(Bubble Sort) 算法简介(Introduction) Bubble sort is to compare adjacent elements of the list a ...

  3. 基础排序算法 – 冒泡排序Bubble sort

    原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束. 从小到大排序: 原 ...

  4. 排序 时间倒序_经典排序算法之冒泡排序(Bubble Sort)

    冒泡排序 ( Bubble Sort ) 冒泡排序,正如它的名字一样,未排序数组中的最大(小)值会依次往上浮.冒泡排序主要有两个基本步骤:相邻元素之间的比较 和 交换位置. 步骤分析: 令待排序序列为 ...

  5. 7.使用php描述冒泡排序,PHP 数据结构 算法描述 冒泡排序 bubble sort

    PHP 数据结构 算法描述 冒泡排序 bubble sort 复制代码 代码如下: /** * 冒泡排序 bubble sort * * 原理:多次循环进行比较,每次比较时将最大数移动到最上面.每次循 ...

  6. Java中的经典算法之冒泡排序(Bubble Sort)

    Java中的经典算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2 ...

  7. 【算法】Bubble Sort(泡式排序)的编程实现思路及其复杂度分析==>冒泡排序

    冒泡排序 Bubble Sort的复杂度分析 什么是复杂度? 简单的来说当我们需要衡量算法的优异程度的时候就需要用到它... 对一个算法来说,我们一般用时间和空间这两个维度来衡量它.也就是算法的执行时 ...

  8. php编写冒泡排序算法_PHP排序算法之冒泡排序(Bubble Sort)实现方法详解

    本文实例讲述了PHP排序算法之冒泡排序(Bubble Sort)实现方法.分享给大家供大家参考,具体如下: 基本思想: 冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换 ...

  9. 排序算法---冒泡排序(java版)

    冒泡排序 原理 冒泡排序(Bubble Sort)是一种简单的排序算法,它通过依次比较两个相邻的的元素,看两个元素是否满足大小关系要求,如果不满足则交换两个元素.每一次冒泡会让至少一个元素移动到它应该 ...

  10. Golang(二十一)[排序算法-冒泡排序]

    Golang-排序算法-冒泡排序 1.简介 2.原理 3.操作规则 4.Golang代码 1.升序 2.降序 3.测试 4.完整代码 5.优化 1.原冒泡排序 2.优化后 1.简介 冒泡排序(Bubb ...

最新文章

  1. 为什么数学的用途这么大?
  2. 腾讯、网易邮箱设置POP3客户端代理
  3. 基于Python+Django实现药品管理系统
  4. 曲线 线性回归_机器学习笔记 线性回归
  5. JavaScript中四种不同的属性检测方式比较
  6. jboss 配置上下文路径_JBoss Portal上的“ Hello World” portlet
  7. html5声明utf-8,HTML5中的SVG – 什么时候是XML声明`?xml version =“1.0”encoding =“UTF-8”?`需要吗?...
  8. 红米7正式首发:4GB+64GB版本售价999元
  9. 钢铁雄心II(HOI2)作弊码合辑
  10. 多投资机构点评神州信息2019业绩:看好金融信创,给出增持评级!
  11. KDD 2016 | node2vec:Scalable Feature Learning for Networks
  12. Exadata X8发布
  13. Python 根据身份证号判断所属省份,生日与性别
  14. 关于区块链及其数据溯源的学习笔记
  15. 【Rust日报】2022-09-13 Stabilize GAT
  16. 实训十七:交换机单端口环路检测配置
  17. 【环信IM集成指南】Web端常见问题整理
  18. 第28届深圳国际礼品展圆满闭幕,五洲御瓷再续“新里程”
  19. SCALABILITY可伸缩性和EXTENSIBILITY可扩展性的区别
  20. 微信进化史(未完待续)

热门文章

  1. 在线办公大势所趋,细说3种主流云办公方式优劣
  2. 九宫格摆法_合战忍者村九宫格布局摆法介绍
  3. 太刺激2007 超级搞笑视频MV
  4. 中国百年校服史:青春飞扬的几代人[转]
  5. css边框_CSS边框
  6. 微型计算机流水灯实验报告,广东海洋大学微型计算机基础流水灯左移右移实验报告.docx...
  7. CHROME浏览器发送HTTP最大请求并发数限制
  8. Linux操作系统汇编指令入门级整理知识点
  9. 前端面试题集合,持续更新中(附答案,简单易懂)
  10. JAVA专辑鉴赏网站计算机毕业设计Mybatis+系统+数据库+调试部署