3种冒泡排序的比较

第一种为: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);
}
原创文章 36 获赞 8 访问量 2761

猜你喜欢

转载自blog.csdn.net/qq_41398619/article/details/105568802
今日推荐