第一种为:for循环i=0,j=n-1为一头一尾从后往前,两两依次比较,即if代码为if(a[j-1]>a[j])
第二种为:for循环i=0,j=n+1跟第一种有差别,if判断一样,
第三种为:for循环i=0,j=n+1,if(a[i]>a[j])为无法进行flag标识优化的屌丝冒泡排序
#include<stdio.h>
void Bubble1(int a[],int n);//高富帅冒泡排序
void Bubble2(int a[],int n);//高富帅冒泡排序
void Bubble3(int a[],int n);//屌丝冒泡排序 无法加flag标识 因为if判断不是两两从下到上比较。
int main()
{
int a[10]={1,0,2,3,5,4,6,7,8,9} ;
Bubble2(a,10);
for(int i=0;i < 10;i++)
printf("%d ",a[i]);
}
void Bubble1(int a[],int n)
{
int i,j,temp,flag=1; //flag为判断是否发生了位置交换
int count1=0,count2=0; //计数器
for (i = 0;i < n-1 && flag;i++)
{
for (j = n-1;j > i;j--)
{
count1++;
flag = 0; //flag若一直为0,说明从下往上 a[j-1]一直小于a[j]不用交换值, 第i个的位置已是这一轮最小的值
if (a[j-1] > a[j])
{
count2++;
flag = 1;
temp = a[j];
a[j] = a[j-1];
a[j-1] = temp;
}
printf("j=%d , i=%d\n",j,i);
}
}
printf("比较了%d次\n",count1);
printf("交换了%d次\n",count2);
}
void Bubble2(int a[],int n) //i,j都是从前向后比
{
int i,j,temp,flag=1; //flag为判断是否发生了位置交换
int count1=0,count2=0; //计数器
for (i = 0;i<n-1 && flag;i++)
{
for (j = i+1;j < n ;j++)
{
count1++;
flag = 0; //flag若一直为0,说明从下往上 a[j-1]一直小于a[j]不用交换值, 第i个的位置已是这一轮最小的值
if (a[j-1] > a[j])
{
count2++;
flag = 1;
temp = a[j];
a[j] = a[j-1];
a[j-1] = temp;
}
printf("j=%d , i=%d\n",j,i);
}
}
printf("比较了%d次\n",count1);
printf("交换了%d次\n",count2);
}
void Bubble3(int a[],int n) //此种类型不能加flag判断,因为i,j都是从开开始比较,无法从后向前得到一个正确的顺序。
{
int i,j,temp,flag=1; //flag为判断是否发生了位置交换
int count1=0,count2=0; //计数器
for (i = 0;i<n-1 && flag;i++)
{
for (j = i+1;j < n ;j++)
{
count1++;
flag = 0; //flag若一直为0,说明从下往上 a[j-1]一直小于a[j]不用交换值, 第i个的位置已是这一轮最小的值
if (a[i] > a[j])
{
count2++;
flag = 1;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
printf("j=%d , i=%d\n",j,i);
}
}
printf("比较了%d次\n",count1);
printf("交换了%d次\n",count2);
}