冒泡排序
在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]<<' ';
}
}