常用排列方法冒泡法能实现对数据从小到大、从大到小的排列。
#include<iostream>
using namespace std;
int main()
{
float arr[7]={12.3,37.9,233,19.5,23,20.5,17.5};
for(int i=0;i<6;i++)
{
for(int j=0;j<6-i;j++)
{
if (arr[j]<arr[j+1])
{
swap(arr[j],arr[j+1]);
}
}
}
for(int i=0;i<7;i++)
{
cout<<arr[i]<<endl;
}
system("pause");
return 0;
}
能成功输出下列数据
233
37.9
23
20.5
17.5
12.3
19.5
但经过思考我们也发现,冒泡排列的外部循环经过四次循环也能得到相同的结果。也就是说在这时我们的目的已经达到,但程序仍在继续运行。
因此我们可以通过添加一个布尔类型的函数来达到判断冒泡排列是否提前得到结果,可以结束进而来节约时间。
而一旦数组中所有的元素的顺序都按照我们所需的顺序正确排列,很明显后续的循环并不会再进行交换,故循环体内的代码均不会被执行。所以我们做出以下修改:
#include<iostream>
using namespace std;
int main()
{
float arr[7]={12.3,37.9,233,17.5,23,20.5,19.5};
for(int i=0;i<6;i++)
{bool swapped=false;//引入布尔型变量
for(int j=0;j<6-i;j++)
{
if(arr[j]>arr[j+1])
{
swap(arr[j],arr[j+1]);
}
swapped=true;//如果该循环体被执行,则将swapped这一布尔型赋值为true
}
if (swapped=false)//上一循环结束后判断swapped的值,若为false则说明未执行,即该数组已按照我们意愿完成排列,可以跳出循环直接输出。
{
break;
}
}
for(int i=0;i<7;i++)
{
cout<<arr[i]<<endl;
}
system("pause");
return 0;
}
至此,冒泡循环算法被成功优化。