用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_流苏
如有错误,还望指正!
如有疑问,欢迎大家在评论区提出!
最后,希望大家多多点赞支持!