通过观察桶排序,我们很容易发现一个致命问题:当我们需要排序的最大数为1000000时,我们需要一个大小为1000001的数组,这就会导致数组占用的内存很大,浪费很多空间。于是,我们有了一种新的排序方法——冒泡排序。

冒泡排序的基本思想是:每次比较相邻的两个元素,如果他们的顺序错误,则把他们的位置进行调换。

例如将3 10 6 27 82 17 22进行从大到小排序,我们的目标就是将较小的数字放到后面。所以比较第一位和第二位数字的大小,我们发现3<10,所以要将3和10进行调换,调换后变成10 3 6 27 82 17 22;紧接着将第二个数和第三个数进行比较发现3<6,我们依旧将3和6进行调换,变成10 6 3 27 82 17 22,以此类推,到此次循环结束时我们成功将这串数字变成了10 6 27 82 17 22 3,这样我们就确定了最后一位数字为3,在进行下一次循环时我们就不需要再遍历到最后一位的3了;随后进行第二次遍历,遍历规则同上。每次遍历我们将确定一个相对小的位置,当我们确定到最后一个数字时,循环结束,我们就得到了排序后的数组。

#include<iostream>
using namespace std;int main()
{int a[100], t, n;//n表示你需要排序的数字的个数cin >> n;for (int i = 0; i < n; i++)//我们遍历进行输入{cin >> a[i];}for (int i = 0; i < n - 1; i++){for (int j = 0; j < n - i; j++)//此处仅需要遍历到n-i,可以思考一下为什么{if (a[j] < a[j + 1]){//交换过程,不必多说t = a[j];a[j] = a[j + 1];a[j + 1] = t;}}}for (int i = 0; i < n; i++){cout << a[i] << " ";}cout << endl;return 0;
}

利用冒泡排序我们就可以解决桶排序遗留下来的一个问题——不能对结构体数组进行排序。

#include<iostream>
using namespace std;typedef struct Student//我们创建了一个结构体数组,用来存放一个学生的姓名和成绩
{char name[21];int score;
};int main()
{Student stu[100], t;int n;cin >> n;//输入学生人数for (int i = 0; i < n; i++){printf("请输入第%d个学生的姓名:", i + 1);cin >> stu[i].name;printf("请输入第%d个学生的成绩:", i + 1);cin >> stu[i].score;cout << endl;}//我们按成绩从高到低进行排序for (int i = 0; i < n - 1; i++){for (int j = 0; j < n - i; j++){if (stu[j].score < stu[j + 1].score){t = stu[j];stu[j] = stu[j + 1];stu[j + 1] = t;}}}for (int i = 0; i < n; i++){cout << stu[i].name << " " << stu[i].score << endl;}cout << endl;return 0;
}

这样我们就完成了一个学生管理系统中的一个重要函数:对学生成绩进行排序。

冒泡排序的核心部分是双重嵌套循环。我们很容易可以看出,冒泡排序的时间复杂度为O(N^2),这是一个非常高的时间复杂度。你以为我们的排序到此就结束了吗?不可能!在下一节我们将会介绍另一种常用的排序算法——快速排序。

算法初步——冒泡排序相关推荐

  1. Java排序算法:冒泡排序

    Java排序算法:冒泡排序 //创建数组并赋值int[] data = new int[] {11,10,55,78,100,111,45,56,79,90,345,1000};for(int i=0 ...

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

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

  3. 排序算法:冒泡排序、插入排序、选择排序、希尔排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.冒泡排序: 1.算法原理: 冒 ...

  4. 数据结构与算法之冒泡排序

    数据结构与算法之冒泡排序 目录 基本介绍 冒泡过程图解 代码实现 1. 基本介绍 冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元 ...

  5. java算法:冒泡排序

    java算法:冒泡排序 冒泡排序:不断遍历文件,交换倒序的相邻元素,直到文件排好顺序.冒泡排序的主要优点是容易实现,冒泡排序通常会比选择排序.插入排序慢. 如,对EXAMPLE 字母进行排序:  E  ...

  6. 排序算法:冒泡排序算法优化实现及分析

    冒泡排序算法介绍 冒泡排序(Bubble Sort)一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序记录为止.这是书上的定义,感觉太弯弯肠子了.冒泡排序是几乎所有学 ...

  7. 【原创】tarjan算法初步(强连通子图缩点)

    [原创]tarjan算法初步(强连通子图缩点) tarjan算法的思路不是一般的绕!!(不过既然是求强连通子图这样的回路也就可以稍微原谅了..) 但是研究tarjan之前总得知道强连通分量是什么吧.. ...

  8. golang 排序_常用排序算法之冒泡排序

    周末无事,带娃之余看到娃娃在算数,想到了排序-尝试着把几种常用的排序算法跟大家聊一聊,在分析的后面我会用GoLang.PHP和JS三种语言来实现下. 常见的基于选择的排序算法有冒泡排序.插入排序.选择 ...

  9. php二分法 冒泡 快速排序,PHP 常见算法【冒泡排序, 快速排序, 插入排序, 取舍排序, 二分法查找, .】...

    PHP 常见算法[冒泡排序, 快速排序, 插入排序, 选择排序, 二分法查找, ..] // 冒泡排序 function bubblesort($arr) { for($i=0,$j=count($a ...

最新文章

  1. 线性回归之正则化线性模型
  2. Android 多线程-----AsyncTask详解
  3. unity_小功能实现(敌人巡逻功能)
  4. Xilinx IP解析之 Fast Fourier Transform(FFT) v9.1
  5. JVM学习笔记之-JVM性能监控-JVM监控及诊断工具-GUI方式-Visual VM-JProfiler-Arthas
  6. 沈向洋对于工程技术人员的十点经验分享
  7. 第五十三期:公司如何选择数据库?DynamoDB、Hadoop和MongoDB 大比拼
  8. Kubernetes Dashboard on Ubuntu 16.04安装记录
  9. D-Link 老款路由器被曝多个高危漏洞,未完全修复
  10. 安阳工学院ACM历史(续)
  11. 计算机c盘内存怎么转给d盘,C盘空间太大怎么把空间转到D盘或E盘
  12. 关于架构师:角色、能力和挑战
  13. 638-字符串模式匹配-KMP算法
  14. 在线视频移动化迁徙加速,UGC待开发
  15. 模拟模型学习----几何布朗运动模拟 与 基于扩散模拟
  16. raspberry pi pico|爷青回!在raspberry pi pico上玩nes游戏(2)(开源树莓派pico NES模拟器)-搭建pico开发环境
  17. mac php 单元测试,PHPUnit单元测试
  18. Chrome浏览器上传图片或图片另存时浏览器无响应
  19. SEO流量变现,看这个项目就够了!
  20. RISC-V 指令架构 -- 模式切换

热门文章

  1. 【图形处理】字模软件与汉字取模(GB2312、GBK,BIG5)(草稿)
  2. HTML网页设计:周杰伦网站
  3. 计算机二级无忧软件mysql_无忧考吧全国计算机二级MS Office模拟软件
  4. [NOIP2016]蚯蚓
  5. 新教师计算机培训心得体会,教师培训心得体会
  6. OBM,ODM,OEM分别指什么
  7. 二进制整数及其表达方式
  8. mysql gman do_Mysql 与Redis的同步实践
  9. Java的socket简单语法实例以及多线程
  10. 【心情分享】自己心中的程序员和别人眼里的程序员