有趣的算法 | 冒泡排序

Posted 柏战不殆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有趣的算法 | 冒泡排序相关的知识,希望对你有一定的参考价值。


柏战不殆
越努力,越幸运
有趣的算法 | 冒泡排序


冒泡排序的基本思想是:每次比较两个相邻的元素,如果他们的顺序错误就把他们交换过来,。

例如我们需要将 2 5 9 4 7 这 5 个数进行从大到小进行排序。

首先从第一位开始,比较第 1 位和第 2 位的大小,现在第 1 位是 2,第 2 位是 5。发现 2 比 5 要小,而我们希望数值越小的越靠后嘛,因此我们需要交换这两个数的位置。交换之后这 5 个数的顺序是 5 2 9 4 7。

按照刚才的方法,继续比较第 2 位和第 3 位的大小,第 2 位是 2,第 3 位是 9。2 比 9 要小,因此我们需要交换这两个数的位置。交换之后这 5 个数的顺序是 5 9 2 4 7。

按照以上依葫芦画瓢,继续比较第 3 位和第 4 位的大小,如果第 3 位比第 4 位小,则交换位置;如果第 3 位比第 4 位小,则继续比较第4位和第5位的大小,最后得到 5 9 4 7 2

经过 4 次比较后我们可以发现最小的一个数已经就位,整个过程就是这样简单。现在来总结一下:如果从大到小排序,每次都是比较相邻的两个数,后面的数比前面的数大,则交换这两个数的位置,没有则继续往下比较,直到最后两个数比较完毕后,这样最小的数就已经归位了。这样的步骤就如同是一个气泡,一步一步往后“翻滚”,直到最后一位。所以这个排序方法叫做“冒泡排序”,是不是很形象呢。

有趣的算法 | 冒泡排序

第一次比较完只有一个数归位,所以将这一次比较成为“一趟”。下面我们将继续重复刚才的过程,将剩下的 4 个数一一归位。

下面就进行第二趟,这一次比较你们猜到是第几小的数归位了吗?答案是将第 2 小的数归位了,你猜中了吗。首先还是先比较第 1 位和第 2 位,如果第 1 位比第 2 位小,则交换位置。交换之后这 5 个数的顺序是 9 5 4 7 2。接下来的操作相信你应该都会了,依次比较第 2 位和第 3 位,第 3 位和第 4 位。到这里需要注意一点,第 5 位已经归位了,在比较是在减低效率,所以到这里就要停止这趟比较。第二趟结束之后这 5 个数的顺序是 9 5 7 4 2。

“第三趟”比较也是一样的。最后得到这 5 个数的顺序是 9 7 5 4 2。到这里你发现这 5 个数已经从大到小排好序了,这时候有的同学会想程序还要继续比较吗?答案是是,程序并不知道这个结果已经符合条件要求,因为它并没有收到任何指令要求停止比较。

“第四趟”只需要比较第 1 位和第 2 位的大小。因为后面三个位置上的数归位了,现在第 1 位是 9,第 2 位是 7,无需交换。这 5 个数的顺序不变仍然是 9 7 5 4 2。到此冒泡排序完美结束了,5 个数已经有 4 个数归位,那最后一个数也只能放在第 1 位了。

最后总结一下:如果有 n 个数进行冒泡排序,只需将 n-1 个数归位,也就是说要进行 n-1 趟操作。而“每一趟”都需要从第 1 位开始进行相邻两个数的比较,将较小的一个数放在后面,比较完毕后向后挪一位继续比较下面两个相邻数的大小,重复此步骤,直到最后一个尚未归位的数,已经归位的数则无需再进行比较。很简单我们可以看出这个算法的时间复杂度为O(n^2),这是一个很高的复杂度,怎么能快速地进行排序呢,请看上一篇。

下面是代码。建议先自己尝试去实现一下看看,再来看我是如何实现的。

1#include<stdio.h>//左右滑动查看全部代码
2int main()
3  
{
4    int a[100],i,j,t,n;
5    scanf("%d",&n);  //输入一个数n,表示接下来有n个数
6    for(i=1; i<=n; i++) //循环读入n个数到数组a中
7        scanf("%d",&a[i]);
8
9    //冒泡排序的核心部分
10    for(i=1; i<=n-1; i++) //n个数排序,只用进行n-1趟
11    {
12        for(j=1; j<=n-i; j++) //从第1位开始比较直到最后一个尚未归位的数,想一想为什么到n-i就可以了。
13        {
14            if(a[j]<a[j+1]) //比较大小并交换
15            {
16                t=a[j];
17                a[j]=a[j+1];
18                a[j+1]=t;
19            }
20        }
21    }
22    for(i=1; i<=n; i++) //输出结果
23        printf("%d ",a[i]);
24    return 0;
25}


-THE END-




▲向上滑动


推荐阅读

有趣的算法 | 冒泡排序






杂谈阅读





以上是关于有趣的算法 | 冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章

Python | 有趣的冒泡排序

谁说按键精灵low,按键精灵冒泡排序算法!

排序算法突击(Java):冒泡排序

php实现冒泡排序算法

冒泡排序算法可视化

算法 | 排序算法图形化比较:快速排序插入排序选择排序冒泡排序