c语言从入门到放弃之冒泡排序

冒泡排序可以让一个无序数组变成有序数组的一种算法思想,但是在我们初学C语言时,会遇到一些大大小小的问题,那接下来就请跟着我的思想来一起理解冒泡排序:

目录

一.头文件

 二.程序主体

1.主程序

(1)定义变量

 (2)引用函数和得知冒泡排序函数正常运行

2.函数部分

(1)函数所接收值和所返回类型

(2)函数内定义变量

 (3)实现功能

源码:


一.头文件

我们进行冒泡排序是需要引用输出函数(printf)来知道我们的无序数组变成有序数组的,所以引用<stdio.h> :

 


 二.程序主体

1.主程序

(1)定义变量

我们要进行冒泡排序,首先需要一个无序数组,还需要得知到这个数组里总共有几个元素,和每个元素的下标,所以我们定义两个变量和一个无序数组:

 (2)引用函数和得知冒泡排序函数正常运行

当我们定义完变量,我们就可以开始调用函数了,调用完函数怎么知道这个冒牌排序函数有没有正常运行呢?这个时候就需要万能的printf了,我们只需要用循环语句,将排完序后的数组内元素一个一个打印出来就ok,那怎么才能从第一个元素开始打印呢?我们上面定义了一个变量,赋值0,当这个变量小于元素个数就进入循环进行打印,打印完之后++,就可以按照顺序从第一个打印到最后一个元素:

 


2.函数部分

(1)函数所接收值和所返回类型

我们定义一个函数应该知道这个函数要接收几个值,所接收值应该是什么类型,所返回类型是什么?因为我们冒泡排序函数只是排序用,所以返回值用void,在来到接收值,我们引用函数是给函数递过来两个值,一个数组一个元素个数,所以我们这里也要放两个形参来接受,第一个是数组,与数组类型一致,第二个元素个数,这里可能会有人有疑问,为什么不能在函数内部把元素个数算出来,毕竟我们已经把数组传过来了,这里是一个很容易错的地方,数组在传参时,只会把数组首元素的地址传过去,所以函数里面的数组实际上只有一个元素,这样要是在到函数里面算元素个数就会和实际元素个数不一样,导致我们这个函数实现不了预期的作用,现在我们就把函数的接收和返回类型订好了:

(2)函数内定义变量

要实现这个功能,我们需要有两个变量,第一个就是冒泡排序所要跑的趟数(j),第二个就是要和几个数比大小(i):

 (3)实现功能

那冒泡排序具体是怎么将无序数组变成有序数组呢?其实不是很复杂,我们上面定义了一个变量,是用来计算要跑的趟数的,那这个趟数是多少呢?我们要知道冒泡排序实际是什么才能得到答案,冒泡排序实际上是从第一个数开始和每个数比大小然后根据是要排升序还是降序来决定要不要换位置,那既然是换位置,只剩一个元素的时候是不是就没有这个换位置的比要了,那是不是我们只用元素个数减一趟就可以将这个数组排序完成了,那我们这么实现跑这么多趟呢?这里用循环语句,如果当我们跑的趟数少于这些应该跑的趟数时,进入循环,然后跑完这趟后加一,继续进行下一个循环:

 那进入循环之后我们要这么让这个元素一趟一趟和他右或左元素对比呢?是不是就需要嵌套另一个循环语句来实现,那这个时候,我们每个元素要比多少次大小才合适呢?每次跑完一趟都会有一个元素确定位置,这个时候我们是不是就没必要和他比了,那我们每个元素是不是只需要比趟数减去跑的第几趟就行:

那接下来都是不是就到了我们比大小环节,那比了大小,我们怎么去换这个元素的位置呢?这个时候就需要一个变量(姑且叫他tihuan),我们把原来的元素(姑且叫1)放到tihuan里面去,那1现在里面就空了,在把2里面的元素放1的里面,在把放在tihuan里面的元素放到2的位置,那这个换位置就好了:

 那到现在整个函数就写完了,我们让代码跑起来运行一下:

 看,我们是不是成功了。

那以上就是我对于冒泡查找整个算法的逻辑上的一个见解,希望对大家有所帮助。

顺祝时祺!

源码:

#include<stdio.h>

void maopao_paixu(int arr[], int sz)
{
	int j = 0;
	int  i= 0;
	for (j = 0; j < sz - 1; j++)
	{
		for (i = 0; i < sz - 1 - j; i++)
		{
			if (arr[i] > arr[i + 1])
			{
				int tihuan = arr[i];
				arr[i] = arr[i + 1];
				arr[i + 1] = tihuan;
			}
		}
	}

}

int main()
{
	int arr[] = { 90,38,34,27,162,487,293 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	maopao_paixu(arr, sz);
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

封心锁爱的前夫哥

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

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

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

打赏作者

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

抵扣说明:

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

余额充值