C语言 冒泡排序

算法代码及其实现

冒泡排序
就是相邻两个数互相比较,(第一个1元素和第2个元素相比,2和3比,3和4比…以此类推)前面的数如果大于后面的,则互换位置;否则不做变化

#include<stdio.h>	
int main()
{
	int n[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1,};//定义一个大小为10的数组
	int i, j,k,temp;
	for (i = 1; i < 10; i++)//外层循环是比较的轮数,数组内有10个数,那么就应该比较10-1=9轮
	{
		for (j = 0; j < 10 - i; j++)//内层循环比较的是当前一轮的比较次数,例如:第一轮比较9-1=8次,第二轮比较9-2=7次
		{
			if (n[j] > n[j + 1])//相邻两个数如果逆序,则交换位置
			{
				temp = n[j];
				n[j] = n[j + 1];
				n[j + 1] = temp;
			}
		}
		printf("第%d趟排序完成后的数据排序:\n",i);
		for (k = 0;k < 10; k++)
		{
			printf("%-4d", n[k]);	//输出左对齐,每个元素占4位的大小 
		}
		printf("\n");
	}
	printf("\n\n\n");
	printf("排序过后的数顺序:\n");
	for (i = 0; i < 10; i++)
	{
		printf("%-4d", n[i]);
	}
	printf("\n");
	
	return 0;
}

在这里插入图片描述
第一轮的比较过程

在这里插入图片描述

优化算法

上面的算法是大部分教材中提供的算法,其中有一点是可以优化的:当比较到第 i 轮的时候,如果剩下的元素已经排序好了,那么就不用再继续比较了,跳出循环即可,这样就减少了比较的次数,提高了执行效率。

未经优化的算法一定会进行 n-1 轮比较,经过优化的算法最多进行 n-1 轮比较,高下立判。

优化后的算法实现如下所示:

#include<stdio.h>	
int main()
{
	int n[10] = {10, 79, 18, 44, 53, 12, 18, 47, 96, 175, };//定义一个大小为10的数组
	int i, j, temp, isSorted;
	for (i = 1; i < 10; i++)//外层循环是比较的轮数,数组内有10个数,那么就应该比较10-1=9轮
	{
		isSorted = 1;   //假设剩下的元素已经排序好了
		for (j = 0; j < 10 - i; j++)//内层循环比较的是当前一轮的比较次数,例如:第一轮比较9-1=8次,第二轮比较9-2=7次
		{
			if (n[j] > n[j + 1])//相邻两个数如果逆序,则交换位置
			{
				temp = n[j];
				n[j] = n[j + 1];
				n[j + 1] = temp;
				 isSorted = 0;  //一旦需要交换数组元素,就说明剩下的元素没有排序好
			}
		}
		
		if(isSorted)
			break; //如果没有发生交换,说明剩下的元素已经排序好了
			
	}

	for (i = 0; i < 10; i++)
	{
		printf("%-4d", n[i]);
	}
	printf("\n");
	
	return 0;
}

在这里插入图片描述

分析代码

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值