待整理
int& a 是引用的意思,相当于原有变量的一个副本。
比如int n = 4; int& a = n; 此时a和n为同一个东西,改变a的值,就会改变n的值。
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
void bubble_sort(int a[],int n)
{
int i,j;
for(i=1;i<n;i++)
for(j=1;j<i;j++)
{
if(a[j-1]>a[j])
swap(a[j-1],a[j]);
}
}
改进版可以加一个flag,在比较的过程中如果没有产生交换则flag为0,说明数组已经是正序的了,不需要继续进行冒泡排序;但应注意,比较长度应该是减少,而不能是增加:
void bubble_sort(int a[],int n)
{
int i=n,j,flag=1;//i由n开始减少
while(i>0&&flag!=0)
{
flag=0;
for(j=1;j<i;j++)
{
if(a[j-1]>a[j])
{
swap(a[j-1],a[j]);
flag=1;//若i由1开始增大,则外圈for循环条件不成立,flag仍为1,跳出while出错
}
}
i--;
}
}
进一步的改进为,随时记录一次遍历需要交换的最大位置,下次遍历时可以便利到这个地方就结束,不需要再向后判断:
//冒泡排序3:
void bubble_sort(int a[],int n)
{
int flag=n;
while(flag>1)//注意判断条件,避免死循环
{
int k=flag;
for(int j=1;j<k;j++)
{
if(a[j-1]>a[j])
{
swap(a[j-1],a[j]);
flag=j;//flag最小值为jmin=1;
}
}
}
}