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

    在Noip中,排序算法虽然不常考,但排序所涉及的思想在竞赛中是比较重要的。我们要输入一串数字,然后把它正确排序,从小到大或从大到小。冒泡排序是一个对新人特别友好的排序方法。它的时间复杂度是0(n^2)。

    我们不妨脑补一下,一杯密度不均匀的物质会发生什么?密度小的气泡和液体会上浮,密度大的液体和固体会下沉。冒泡排序就是利用了这个方式。我们有一个数列a,数字a1,a2,a3,a4属于数列a,那么我从a1开始,如果a2比a1小,就交换a1和a2的值,再到a2的位置,此时a2是原a1和a2的较大值。我们再比较现在的a2和a3,较小的放在前面。在a4结束之后,判断数列是否有序,若无序则从a1继续原来的操作。这样,数值小的数就一个个像气泡一样冒到前面去了。

    冒泡排序的最坏情况就是最小的数在数列的末尾,我们需要循环n(n为数列长)次这样的操作才能使数列完全有序,而每次循环需要遍历n个数字,所以我们的时间复杂度就是0(n^2)了。

    那么接下来我把c++的实现代码放上来。

    #include<iostream>
        #include<cstdlib>
        using namespace std;
        int main()
        {
        int number[1000],n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
        cin>>number[i];
        }
        while(true)//无限循环
        {
        bool a=0;
        for(int i=1;i<n;i++)// 这里取i<n而不取i=n是因为我们不用遍历到最后一个数字
        {
        if(number[i]>number[i+1])//判断数列是否依然无序
        {
        a=1;
        }
        }
        if(a==0)
        {
        break;//如果有序就结束循环
        }
        for(int i=1;i<n;i++)//这里取i<n而不取i=n是因为我们不用遍历到最后一个数字
        {
        if(number[i]>number[i+1])
        {
        swap(number[i],number[i+1]);//交换两个值
        }
        }
        }
        for(int i=1;i<=n;i++)
        {
        cout<<number[i]<<' ';
        }
        }


  • 相关阅读:
    mac下通过复制启动两个tomcat
    搭建一个redis集群
    ubantu系统下永久修改主机名
    民宿项目知识_截取最后一个逗号
    民宿项目知识_string判断是否为空
    民宿项目知识_enum
    民宿项目中的知识点_动态删除tr
    笔记:迁移来自xinlang的笔记
    SVN使用笔记
    iOS性能优化笔记
  • 原文地址:https://www.cnblogs.com/sherrlock/p/9525801.html
Copyright © 2011-2022 走看看