【C语言】冒泡排序

Author:MTingle
人工智能专业
荃者所以在鱼,得鱼而忘荃;蹄者所以在兔,得兔而忘蹄;言者所以在意,得意而忘言。吾安得夫忘言之人而与之言哉!

编写程序bubble.c实现冒泡排序。输入n个整数 (0<n<10) ,按从小到大的顺序排好序,然后输出。采用数组实现
格式要求输入: 先输入n (scanf("%d",&n)) ,然后采用循环输入n个整数,存入数组m,每个元素的输入为scanf("%d",&m[il)
例如:for (i = 0;i < n; i++scanf"%d",&mli);
输出:
(1) 如果输入不符合要求,则printf("ERROR”(2) 循环依次输出排序后的数组元素,每个元素的输出为:printf("t%d",mli])


完整代码如下:

#include<stdio.h>
int main()
{
	int arr[10] = {0};
	//一共有n个数
	int n = 0;
	printf("数组中存储的数字个数>>:");
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		printf("请输入第%d个数字>>:", i + 1);
		scanf("%d", &arr[i]);
	}
	int k = 0;
	int m = 0;
	int temp = 0;
	for (m = 0; m < n-1; m++)
	{
		for (k = 0; k < n - m-1; k++)
		{
			if (arr[k] >= arr[k + 1])
			{
				temp = arr[k+1];
				arr[k + 1] = arr[k];
				arr[k] = temp;
			}
			temp = 0;
		}
	}
	printf("排序结果如下:\n");
	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
}

一、冒泡排序的原理

 通过这个图片,我们可以看出,冒泡排序每次都会将前面几个数中最大的数取出来,那么它具体是怎么操作的呢,我们运用上图中的例子展开解释,通过动图,我们可以看出,冒泡排序每次都会选出最大的那个数,第一次选出了10,第二次是9,然后是8......

那么具体是怎么选出的呢,从第一个数开始,6比4大,所以6和4交换位置,然后6和1比,6比1大,所以6和1交换位置,知道6和9比,9比6大,所以不用交换位置,接着9和3比,9比3大,所以9和3交换位置.....以此类推,最终选出来的最大的数是10

if (arr[k] >= arr[k + 1])
			{
				temp = arr[k+1];
				arr[k + 1] = arr[k];
				arr[k] = temp;
			}

所以我们可以写出上面这串代码,那么这个temp是什么呢?

假想一下若我们是这样写的:

if (arr[k] >= arr[k + 1])
            {
                arr[k + 1] = arr[k];
                arr[k] = arr[k+1]
            }

那么会发生怎样的事情呢,若我们假设arr[k]=10,arr[k+1]=9,那么当arr[k]>arr[k+1]时,二者交换位置直接写:
         
    arr[k + 1] = arr[k];
    arr[k] = arr[k+1]

当第一行运行的时候,arr[k+1]变成了arr[k]=10,那么此时arr[k]和arr[k+1]里面的数都变成了10,那第二行的代码 arr[k] = arr[k+1]实际上就是10=10,就毫无意义了,所以我们需要提前将arr[k+1]中的值用temp这个数保存下来,这样temp里面存储的数就是原来arr[k+1]的数,就是9。

二、设置循环

假设只有2个数需要比较,此时n=2,我们是不是只要比较一次就能选出最大的那个数,假设有3个数要比较,如9 5 1那么我们第1轮比较是不是能选出最大的那个数9,那么是不是就变成了5 1 9,紧接着,我们是不是要再比较一轮,得到1 5 9,但是我们每一轮比较是不是都要从第一个数开始,从前往后和相邻的数再次比较,所以根据这个逻辑,我们可以得出要设置两个循环

int k = 0;
	int m = 0;
	int temp = 0;
	for (m = 0; m < n-1; m++)
	{
		for (k = 0; k < n - m-1; k++)
		{
			if (arr[k] >= arr[k + 1])
			{
				temp = arr[k+1];
				arr[k + 1] = arr[k];
				arr[k] = temp;
			}
			temp = 0;
		}
	}

由此我们可以得到,当有n个数是,我们需要选择n-1个数,因为我们要比较n-1轮,注意数组下标从0开始,所以是m<n-1没有等号

那么第二个循环又是什么意思呢,第二个循环每一轮比较的具体体现,就是我们是怎么把最大的数一次次取出来的,因为第一轮比较我们得到了最大的数,第二轮比较得到了第二大的数,所以我们每一轮比较是不是就不需要和之前几轮取出的最大的数比较了(并且那些数已经被我们放到了数组的末尾)所以需要k<n-m-1,注意数组下标是从0开始的,所以这里依然没有取等

每一次比较结束我们都要令temp=0,讲temp里面存储的值清掉。

三、设置循环

数组的输入:

int arr[10] = {0};
	//一共有n个数
	int n = 0;
	printf("数组中存储的数字个数>>:");
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		printf("请输入第%d个数字>>:", i + 1);
		scanf("%d", &arr[i]);
	}

数组的输出:

printf("排序结果如下:\n");
	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}

四、运行结果


总结

博主将持续更新有关C语言的基础题目,java的基础练习,以及数据结构的内容,有需要的可以关注一下

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值