啊哈算法 之 冒泡排序
2014-10-20 00:36
148 查看
算法介绍
冒泡算法1956年开始就有人开始研究。冒泡排序的基本思想就是:每次比较两个相邻元素,如果他们的顺序错误就把它们交换过来。
举个栗子
例如我们需要将 12,35,99,18,76 5个数进行从大到小排序,既然是从大到小排序,也就是越小越靠后。首先比较第一个数和第二个数,第一个是12,第二个是35,发现12 小于35,由于是越小越靠后,因此要对这两个数交换位置,那么交换后的顺序为 35,12,99,18,76。按照之前的方法,我们比较第二个和第三个数,第二个是12第三个是99,99大于12,所以要交换两个数的位置,交换过的顺序为 35,99,12,18,76。一次类推,可以通过下图来看12的位置变化:
12,35,99,18,76 第一次交换
35,12,99,18,76 第二次交换
35,99,12,18,76 第三次交换
35,99,18,12,76 第四次交换
35,99,18,76,12 第五次交换
进行五次交换后,就成功把最小的数12给排到最后面了。
这样我们就将最小的数给归位了,但是,其他四个数还没就位,所以我们就要接着比较,我们在上次排序的基础上,拿第一个数35和第二个数99进行排序,发现99大于35,因此进行交换,交换之后为99,35,18,76,12 ,就这样按着第一趟的方法依次比较,最后得到的顺序为:99,35,76,18,12.这样第二小的数18 成功归位。
按照上面的方法,在进行三次排序,最后就能实现从大到小的排序了。
现在我们回忆一下,每次都比较相邻的两个数,,如果后面的数比前面的大,两个数就进行交换位置,一直比较下去最小的一个数就在最后一位了,就如同一个气泡,一步步向上翻滚,最后成功浮出水面,随意这个排序方法就有个很好听的名字,冒泡排序,相信大家最熟悉的排序也就是他了,谁叫他的名字这么好记呢。
代码实现
下面我们就用代码实现一下:#include <stdio.h> int main(int argc, const char * argv[]) { int a[100],i,j,t,n; scanf("%d",&n); //输入n个数 for (i = 1; i <= n; i++) { scanf("%d",&a[i]); } for (i = 1; i < n-1; i++) { //n个数排序,只进行n-1趟 for (j = 1; j < n-i; j++) { //从第一位开始,知道最后一位数 if (a[j] < a[j+1]) { t = a[j]; a[j] = a[j+1]; a[j+1] = t; } } } for (i = 1; i <= n; i++) { printf("%d ",a[i]); } printf("\n"); return 0; }
相信大家都能看懂上面的代码。我就不在细讲了,大家可以去自己的编译环境运行一下,好好琢磨一下。
时间复杂度
冒泡排序的核心部分是双重嵌套循环,不难看出冒泡排序的时间复杂度为O(N2)(N的2次幂),这是一个非常高的时间复杂度。算法的优缺点
冒泡排序早在1956年就有人开始研究,之后有很多人尝试着改进该算法,但结果却是令人失望的,如Doonald E.Knuth 1974年所说:冒泡排序除了他迷人的名字和导致了某些有趣的理论问题之外,似乎没有什么值得推荐的。相关文章推荐
- 常用算法(冒泡排序、二分法查找)
- 白话经典算法系列之一 冒泡排序的三种实现
- 【算法】冒泡排序
- c# 数据结构算法学习一:冒泡排序
- 【坐在马桶上看算法】算法2:邻居好说话:冒泡排序 推荐
- 算法:冒泡排序
- 蛮力算法: 选择排序 冒泡排序(详解)
- 经典算法:二分查找、插入排序、选择排序、冒泡排序
- python算法-冒泡排序
- 白话经典算法系列之一 冒泡排序的三种实现
- 每天一算法 -- (冒泡排序)
- 三个简单的算法—冒泡排序
- 第十五周项目一——验证算法之冒泡排序
- 算法研究之插入排序、冒泡排序
- JAVA初级算法之--冒泡排序
- 白话经典算法系列之一 冒泡排序的三种实现
- 轻松学算法2:邻居好说话——冒泡排序
- 算法总结JS版(一)—— 冒泡排序(Bubble Sort)
- 三个典型的经典算法冒泡排序,插入排序,选择排序
- 算法:冒泡排序