冒泡排序
冒泡排序是指依次比较两个相邻的数,如果顺序错误就把他们交换过来,直到没有相邻的数需要交换,也就是说该数列已经排序完成
如图:
举个例子:
像上图这样,每两个数为一组,按序判断完所有组后叫做一轮。大多数数据需要多轮才能完成排序,如上图4和3的位置的是错误的
每完成一轮排序,就能确定至少一个数的正确位置,如7,就被移到了最大的位置
如果我们设数的总数为n,那么组数就为n-1(第一个不用和它前面的排序,最后一个不用和它后面的排序,因此就少一组)
而排序所需的最少轮数也为n-1。因为每轮排序都能排好一个数,而最后的一次排序会直接确定两个数的位置,所以为n-1
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a[20];//假设总数不超过20
cin>>n;//输入总数
for(int i=1;i<=n;i++)cin>>a[i];//输入数列
for(int i=1;i<=n-1;i++)//枚举轮数
{
for(int j=1;j<=n-1;j++)//枚举组数
{
if(a[j]>a[j+1])swap(a[j],a[j+1]);//如果前比后大,交换两数(从小打到大排序)
}
}
return 0;
}
如果要写从大到小排序的,只要更改判断里的符号就可以了
优化
既然每轮都能排好一个数,那么下一轮就多一个不用排的数,程序就不必对那些数再进行判断和交换了
也就是说,每当轮数加一时,需要排序的数列的末尾就向前移动一位,这样能省去大约一半的判断
for(int i=1;i<=n-1;i++)//枚举轮数
{
for(int j=1;j<=n-i;j++)//枚举组数,优化时直接减去轮数即可,因为轮数等于已排好的数
{
if(a[j]>a[j+1])swap(a[j],a[j+1]);//如果前比后大,交换两数(从小打到大排序)
}
}