//冒泡排序
#include<iostream>
using namespace std;
void maopaopx(int a[],int n)
{
int temp;
for(int i=0;i<n;i++)//i用来控制比较的次数
{
for(int j=0;j<n-i;j++)//j用来进行前后两个数的比较,j比较的次数由i控制
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
int main()
{
int a[]={57,68,59,52,72,28,96,33,2};
for(int i=0;i<sizeof(a)/sizeof(a[0]);i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
maopaopx(a,sizeof(a)/sizeof(a[0])-1);
for(int i=0;i<sizeof(a)/sizeof(a[0]);i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
system("pause");
return 0;
}
冒泡排序的优化,加入了一个判断,如果在一次冒泡中,没有交换一次,那么就不需要在进行后续的冒泡了,因为后面已经排好了。
#include<iostream>
using namespace std;
void fun(int a[],int len)
{
int t;
bool falg=true;
int k=len;//k用来控制冒泡次数
while(falg)
{
falg=false;
for(int j=0;j<k;j++)
{
if(a[j]>a[j+1])
{
falg=true;
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
k--;
}
}
int main()
{
int a[]={2,5,-1,0,16,89,-32,-1,-4,90};
int len=sizeof(a)/sizeof(a[0])-1;//必须减一,比较次数少一,又是从 0 开始计数的
fun(a,len);
for(int i=0;i<len+1;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
system("pause");
return 0;
}
进一步的优化。如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。
//改进冒泡2
#include<iostream>
using namespace std;
void fun(int a[],int len)
{
int t,k;
int falg=len;
while(falg>0)
{
k=falg;
falg=0;
for(int j=0;j<k;j++)
{
if(a[j]>a[j+1])
{
falg=j;
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
int main()
{
int a[]={2,5,-1,0,16,89,-32,-1,-4,90,-1,0,-45};
int len=sizeof(a)/sizeof(a[0])-1;//必须减一,比较次数少一,又是从 0 开始计数的
fun(a,len);
for(int i=0;i<len+1;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
system("pause");
return 0;
}
参考来自:http://blog.youkuaiyun.com/morewindows/article/details/6657829

被折叠的 条评论
为什么被折叠?



