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_流苏

如有错误,还望指正!

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

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


目录
相关文章
|
1月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
39 2
C++入门12——详解多态1
|
1月前
|
算法 C++
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
37 5
|
1月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
81 1
|
1月前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
23 0
|
1月前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
27 0
|
1月前
|
存储 编译器 C语言
深入计算机语言之C++:类与对象(上)
深入计算机语言之C++:类与对象(上)
|
1月前
|
存储 分布式计算 编译器
深入计算机语言之C++:C到C++的过度-2
深入计算机语言之C++:C到C++的过度-2
|
1月前
|
编译器 Linux C语言
深入计算机语言之C++:C到C++的过度-1
深入计算机语言之C++:C到C++的过度-1
|
1月前
|
分布式计算 Java 编译器
【C++入门(下)】—— 我与C++的不解之缘(二)
【C++入门(下)】—— 我与C++的不解之缘(二)
|
1月前
|
编译器 Linux C语言
【C++入门(上)】—— 我与C++的不解之缘(一)
【C++入门(上)】—— 我与C++的不解之缘(一)