大家看看我这个是冒泡排序吗?

来源:百度知道 编辑:UC知道 时间:2024/05/16 09:53:53
#include "iostream.h"
int i,j,n,k,a[1000];
bool t;
int main()
{
cin>>n;
for (i=1;i<=n;i++)
cin>>a[i];
t=true;
k=0;
while (t)
{
j=1;
t=false;
for(i=2;i<=n-k;i++)
{
if (a[j]>a[i])
{
t=true;
a[j]=a[j]+a[i];
a[i]=a[j]-a[i];
a[j]=a[j]-a[i];
}
j++;
}
k++;
}
for (i=1;i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
我在网上看到好多人写的冒泡排序的标程都是用2个for循环而且没有退出条件(象我这个程序的t变量),我有点被搞晕了.请各位大虾帮帮忙.谢谢.

搞得这么麻烦,直接冒泡方便多了,你的while也属于循环,复杂度也是n²

#include "iostream.h"
int i,j,n,k,a[1000];
bool t;
int main()
{
cin>>n;
for (i=1;i<=n;i++)
cin>>a[i];
t=true;
k=0;
while (t)
{
j=1;
t=false;
for(i=2;i<=n-k;i++)
{
if (a[j]>a[i]) //相邻的两个数比较,如1和2,2和3,3和4...for一次循环结果是最大的一个数沉到了最底下。
//当都已经排好序,if不执行了,此时t = false继续下去,到while(t)则中断while循环
{
t=true;
a[j]=a[j]+a[i];
a[i]=a[j]-a[i];
a[j]=a[j]-a[i];
}
j++;
}
k++; //排好序的数 的个数为k
}
for (i=1;i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}

那个t就是判断是否还在交换,如果不交换了,就直接退出循环;否则就到循环完为止。

是不是CPU还要多跑路啊,算法不好