个人练习5.C语言实现冒泡排序

算法思路:采用冒泡排序方法对n个数按升序排序,共需n-1趟排序。第i趟排序过程:相邻数组元素a[0]和a[1]、a[1]和a[2]、…、a[n-1-i]和a[n-i]依次进行比较,如果a[j]>a[j+1],则交换a[j]和a[j+1]。

代码实现:

#include<stdio.h>

int main()
{
	int i,j;
	int a[10],temp;
	printf("input 10 numbers:");
	for(i=0;i<10;i++)
	{
		scanf("%d",&a[i]);
	}
	for(i=1;i<10;i++)
	{
		for(j=0;j<10-i;j++)
		{
			if(a[j]>a[j+1]){
				temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
		}
	}
	for(i=0;i<10;i++)
	{
		printf("%3d",a[i]);
	}
	printf("\n");
	return 0;
}

运行结果:

在这里插入图片描述

这种排序不论a[j]是否大于a[j+1]都做了比较,导致效率下降。现在我们改进下算法,使得有序的数比较时不需要交换数据。引进变量flag来帮助判断

改进代码:

#include<stdio.h>

int main()
{
	int i,j,flag;
	int a[10],temp;
	printf("input 10 numbers:");
	for(i=0;i<10;i++)
	{
		scanf("%d",&a[i]);
	}
	for(i=1;i<10;i++)
	{
	    flag=0;//假设第i趟没有交换数据,给flag赋值为0
		for(j=0;j<10-i;j++)
		{
			if(a[j]>a[j+1]){
				temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
				flag=1;
			}
		}
		if(flag==0)break;//没有数据交换时终止循环
	}
	for(i=0;i<10;i++)
	{
		printf("%3d",a[i]);
	}
	printf("\n");
	return 0;
}
发布了9 篇原创文章 · 获赞 0 · 访问量 546

猜你喜欢

转载自blog.csdn.net/qq_41310074/article/details/105331187