C/C++语言入门——冒泡排序问题

简介: C/C++语言入门——冒泡排序问题

用C/C++语言实现冒泡排序

以下就解决此问题分为三步


1.识思想

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法

它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。(参考:百度百科)

等等,真的。。。懂了吗?

冒泡排序,冒泡排序,冒泡,排序。究竟怎么个冒泡法呢?接下来我们来理解下其原理

2.明其理

冒泡排序的原理

从左到右,相邻元素进行比较。每比较一趟,就会找到几个数当中最大的(或最小的)一个。找到的这个数(泡)就会从最右边的位置冒出来。

以4,2,5,1,3为例**(排序为升序,即从小到大排序)**

第一趟比较完之后,所有数中的最大数就会浮到最右边,也就是5会跑到最右侧,此时序列为4,2,1,3,5。

接着进行第二趟比较,比较之后,同理,4会跑到最右侧(剩下四个数4,2,1,3的最右侧,也即右侧倒数第二个位置),此时序列为2,1,3,4,5

第三趟比较,2和1比,2>1,所以它俩互换位置,序列变为1,2,3,4,5。2和3比,2<3,故不进行交换。

到第三轮序列就已经排好了,那么就结束比较了吗?

答案是:不

还有第四趟的比较,因为1和2还没有进行比较,1和2比,1<2,所以不用交换,到此,整个序列的才算排序完毕。

3.写实例

以实体为例,进行编程

以五个数字排序习题为例,如果是第一次写冒泡程序,那么建议先编程写一下试试,再去看下面代码更好一些;如果是能写出,但是不理解,那么可以看看上面思想和原理再结合下面实例练习,有助于加深对冒泡排序的理解。

题:给定五个数字,用冒泡排序的方法编程实现升序排序

给定4,2,5,1,3五个数(自己可以任选数据范围内的五个整数),进行冒泡排序

C语言实现冒泡排序

#include<stdio.h>
int main()
{
  int a[5]={4,2,5,1,3};
  int i,j,temp;
  for(i = 0;i < 5;i++)//外循环为排序趟数,5个数进行4趟
  {
    for(j = 0;j < 5-1-i;j++)//内循环为每趟比较的次数,第i趟比较5-1-i次
    {
      if(a[j]>a[j+1])//相邻元素比较,若逆序则交换(升序为左大于右,降序反之)
      {
        temp=a[j];
        a[j]=a[j+1];
        a[j+1]=temp;
      } 
    }
  }
    for(i = 0;i<5;i++)
    printf("%d ",a[i]); 
  return 0;
}

C++实现冒泡排序

#include<iostream>
using namespace std;
int main()
{
  int a[5]={4,2,5,1,3};
  int i,j,temp;
  for(i = 0;i < 5;i++)//外循环为排序趟数,5个数进行4趟
  {
    for(j = 0;j < 5-1-i;j++)//内循环为每趟比较的次数,第i趟比较5-1-i次
    {
      if(a[j]>a[j+1])//相邻元素比较,若逆序则交换(升序为左大于右,降序反之)
      {
        temp=a[j];
        a[j]=a[j+1];
        a[j+1]=temp;
      } 
    }
  }
    for(i = 0;i<5;i++)
    cout<<a[i]<<" ";
  return 0;
}


仔细来看,每轮比较的次数是 j<5-1-i,而不是 j<5-1呢?如果你对此有疑问,建议看下下面解释。

首先,冒泡排序有一个特点,如果这个程序是从小到大排序,在第一趟排序以后,最大的数就会浮到最右边;在第二趟排序以后,第二大的数会浮到右侧倒数第二个位置……总的来说,就是排序多少趟,就有多少个数字已经按排序要求排好了,而剩下的一个数字已不需要再排序,所以是5-1-i而不是5-1。当然5-1也可以,但是就算法的整体来说,5-1-i的效率更高。

如果想知道冒泡排序的平均时间复杂度,可以看一下我写的这个几种常见排序算法的平均时间复杂度。https://blog.csdn.net/qq_51646682/article/details/120395551?spm=1001.2014.3001.5501


作者:code_流苏

如有错误,还望指正!

如有疑问,欢迎大家在评论区提出!

最后,希望大家多多点赞支持!


目录
相关文章
|
26天前
|
C++
C++ 语言异常处理实战:在编程潮流中坚守稳定,开启代码可靠之旅
【8月更文挑战第22天】C++的异常处理机制是确保程序稳定的关键特性。它允许程序在遇到错误时优雅地响应而非直接崩溃。通过`throw`抛出异常,并用`catch`捕获处理,可使程序控制流跳转至错误处理代码。例如,在进行除法运算或文件读取时,若发生除数为零或文件无法打开等错误,则可通过抛出异常并在调用处捕获来妥善处理这些情况。恰当使用异常处理能显著提升程序的健壮性和维护性。
42 2
|
1月前
|
安全 编译器 程序员
【C++初阶】C++简单入门
【C++初阶】C++简单入门
|
26天前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
43 0
|
13天前
|
编译器 Linux C语言
C++基础入门
C++基础入门
|
4天前
|
JavaScript 前端开发 测试技术
一个google Test文件C++语言案例
这篇文章我们来介绍一下真正的C++语言如何用GTest来实现单元测试。
8 0
|
1月前
|
安全 编译器 C++
C++入门 | 函数重载、引用、内联函数
C++入门 | 函数重载、引用、内联函数
25 5
|
1月前
|
存储 安全 编译器
C++入门 | auto关键字、范围for、指针空值nullptr
C++入门 | auto关键字、范围for、指针空值nullptr
48 4
|
1月前
|
编译器 C语言 C++
C++入门 | 命名空间、输入输出、缺省参数
C++入门 | 命名空间、输入输出、缺省参数
33 4
|
1月前
|
编译器 程序员 C语言
C++入门
C++入门
30 5
|
1月前
|
编译器 C++ 容器
C++语言的基本语法
想掌握一门编程语言,第一步就是需要熟悉基本的环境,然后就是最重要的语法知识。 C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。 对象 - 对象具有状态和行为。例如:一只狗的状态 - 颜色、名称、品种,行为 - 摇动、叫唤、吃。对象是类的实例。 类 - 类可以定义为描述对象行为/状态的模板/蓝图。 方法 - 从基本上说,一个方法表示一种行为。一个类可以包含多个方法。可以在方法中写入逻辑、操作数据以及执行所有的动作。 即时变量 - 每个对象都有其独特的即时变量。对象的状态是由这些即时变量的值创建的。 完整关键字
43 2