zoukankan      html  css  js  c++  java
  • 排序十式之冒泡排序

    题西林壁
    宋·苏轼
    横看成岭侧成峰,远近高低各不同,
    不识庐山真面目,只缘身在此山中。

     

      也许你第一眼看到这篇博客会说,我不是来排序算法的吗,一言不合来首诗是几个意思啊?你看到这大可以放心,这一定是一个排序算法的讲解博客。

    写诗的目的就是笔者先装个(你懂的)

    这首诗其实自有深意,且容我娓娓道来。。。

      排序十式是讲解了十个简单的常用算法:**冒泡排序,插入排序,希尔排序,选择排序,桶排序,快速排序,归并排序,堆排序,基数排序,计数排序。**本文将着重谈论冒泡排序。

      大家应该上中小学的时候按大小个换过座位吧(但愿都有这个经历)/换座位的时候,老师让所有同学,在教室外面站成一列,然后让同学们自行按身高调整至最终状态,即列首至列尾从高到低排列,同学们和相邻的同学比高低,“矮子,到我后边去”,“长得高,山大无柴烧”,同学们和平的比较身高并且不断调整顺序,就能达到老师要求的最终状态。比如

    在这里插入图片描述
    这是刁家三兄弟,这三个人大家以后会经常见到。他们需要通过在队伍里自我和相邻的人比较调整,使得队伍变成由高到低的次序,既然第一个人左边没有人,右边有人,而最后一个人右边没人,只有左边有人,那么实际上就可以把和相邻两人的比较,改为当前的人和后面一个人比较,在图中给即中刁和小刁比,小刁和大刁比,大刁和空气比 大刁没人比了,那么就算第一轮调整结束,那么让我们来观察他们是如何调整的。
    第一个人和第二个人比较,即小刁和中刁比较,小刁高,所以小刁和中刁交换位置,小刁变成了队伍的第二个人,然后第二个人和第三个比,即小刁和大刁比,小刁矮,故小刁和大刁交换位置,结果如下图所示:

    在这里插入图片描述

    注意这个时候第三个人变成了小刁,第三个人后面没有人,故第一轮比较就结束了。这个时候细心的人会发现(如果没有发现请不要忧伤,亡羊补牢,为时未晚)最矮的小刁从第一个人变成了最后一个人,对!冒泡排序每一轮比较完成都会让当前未归位的人中最矮的人归位(在这里就是跑到队尾)。每一轮有一个人归位,那么n个人一个需要几轮才能让所有人归位呢?
    n轮?。。。。。。。。。。。。。其实是n-1轮,因为当n-1个人归位了,就只剩一个人,也就没必要再调整了。冒泡的原理就是:每次比较相邻的两个元素,如果他们顺序错误就把他们交换过来。
    为什么不直接让最高的站到队首去,第二高的站在第二个位置,以此类推呢?因为他们是队伍内部比较排序,“不知庐山真面目,只缘身在此山中”也就是形容他们的。接下来再看个从小到达冒泡排序的示意图,相信看过之后能很好地理解冒泡的原理:
    在这里插入图片描述
    冒泡排序的核心是两层嵌套循环,其时间复杂度是O(N²),对于搞算法的人这么高的复杂度实在是惨不忍睹,但他确实是排序基础,后面也会介绍更优的内部比较算法(冒泡算法有太多重复的比较)。看到这里~~,相信你应该也明白冒泡排序怎么用代码实现了吧~~ ,接下来看看冒泡排序的代码长什么样吧。
    在这里插入图片描述

    c++实现

    #include<bits/stdc++.h>//c++万能库
    using namespace std;
    int main()
    {
        int a[105];
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<=n-1;i++)//n个数只需要比较n-1轮
        {
            for(int j=1;j<=n-i;j++)//每一轮结束,都有一个数字归位,到数组末尾,所以是j<=n-i
            {
                if(a[j]<a[j+1])//比较大小,如果顺序错误则交换
                {
                    int t=a[j];
                    a[j]=a[j+1];
                    a[j+1]=t;
                }
            }
        }
        //输出结果
        for(int i=1;i<=n;i++)
            printf("%d%c",a[i],i==n?'
    ':' ');
        return 0;
    }
    

    鄙人写这些基础的排序算法,实际是为了增强语言表达能力(闲得胃疼),还有就是温习一下算法思想。。。

  • 相关阅读:
    标准C语言(9)
    标准C语言(8)
    标准C语言(7)
    标准C语言(6)
    标准C语言(5)
    标准C语言(4)
    标准C语言(3)
    标准C语言(1)
    Linux基础
    Kafka 学习笔记之 Kafka0.11之console-producer/console-consumer
  • 原文地址:https://www.cnblogs.com/DeepJay/p/12025222.html
Copyright © 2011-2022 走看看