有趣的算法 | 冒泡排序
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-
▲向上滑动
推荐阅读
杂谈阅读
以上是关于有趣的算法 | 冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章