C语言之冒泡排序

排序(sort)就是以一定的基准,将数据按照升序(从小到大)或降序(从大到小)重新排列。

冒泡排序法

我们用一段程序来演示。

/*读取学生的身高并排序*/
#include<stdio.h>

#define NUMBER 5
/*冒泡排序*/
void bsort(int a[], int n)
{
	int i, j;
	
	for(i = 0; i < n - 1; i++)//总共有n-1趟
	{
		for(j = n - 1; j > i; j--)//从末尾向开头遍历
		{
			if(a[j - 1] > a[j])//比较末尾向起始相邻两元素的大小
			{
				int temp = a[j];
				a[j] = a[j - 1];
				a[j - 1] = temp;//如果左侧值较大,则左右两个值交换
			}
		}
	}
}
int main()
{
	int i;
	int height[NUMBER];//5名学生的身高
	
	printf("请输入%d学生的身高。\n", NUMBER);
	
	for(i = 0;i < NUMBER;i++)
	{
		printf("%2d号:", i + 1);
		scanf("%d", &height[i]);
	}
	bsort (height, NUMBER);
	
	puts("按升序排列。");
	for(i = 0;i < NUMBER;i++)
			printf("%2d号:%d\n", i + 1, height[i]);
	
	return 0;
}

我们用下面五个数值把程序在按照升序排列的过程手动显示出来,对照程序来理解。

bsort函数所接受的元素个数为n的数组a中保存着以下的值

179163175178173

首先看末尾两个数组组成的数值对[178,173],由于要进行升序列,后面的值不能小于前面的值,所要要交换两个值。

179163175173178

这对应程序中的以下语句:

for(i = 0; i < n - 1; i++)//总共有n-1趟
	{
		for(j = n - 1; j > i; j--)//从末尾向开头遍历

其中第一行的语句意思是从第一趟开始,一共有n-1趟,第二行语句是在每一趟中从末尾向起始进行数组中元素的遍历。

if(a[j - 1] > a[j])//比较末尾向起始相邻两元素的大小
			{
				int temp = a[j];
				a[j] = a[j - 1];
				a[j - 1] = temp;//如果左侧值较大,则左右两个值交换
			}

这段语句的功能是判断相邻元素的大小,如果右侧数值大则进行交换数值,其中进行两数值交换的方法我们在前面讲过。

下面我们看交换后的数值:

179163175173178

然后看倒数第二个和倒数第三个数[175,173],同样进行交换

179163173175178

重复以上步骤,总共执行4次(n-1次)如下

179163175178173
179163175173178
179163173175178
179163173175178
163179173175178

这是第一趟,将最小的数值163排序到最后,重复同样的操作,进行第二趟排序,将173排到第二位:

163179173175178
163179173175178
163179173175178
163173179175178

接下来进行第三趟,将179排到第四位,175排到第三位:

163173179175178
163173179175178
163173175179178

接下来我们进行第四趟,将179排列到第五位:

163173175179178
163173175178179

第四小的178排列到第四位,末尾就是最大的数值了,也就是说在有n个元素的情况下,只需要进行n-1趟,就可以完成排序。

在该程序中使用的算法就称为冒泡排序法(bubble sorting)

在下一节我们将会学到枚举类型,希望与大家一同进步!

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学海无涯.苦作舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值