啊哈算法 之 冒泡排序

算法介绍

冒泡算法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年所说:冒泡排序除了他迷人的名字和导致了某些有趣的理论问题之外,似乎没有什么值得推荐的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值