冒泡排序

在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]<<' ';
    }
    }


原文地址:https://www.cnblogs.com/sherrlock/p/9525801.html