C语言冒泡排序

目录

一、冒泡排序

①、i<9的解释

②、j<9-i的解释

二、冒泡排序写在函数中

1、自定义bubble_sort函数

①、变量sz位置及计算注意事项

 ②、参数类型解释


一、冒泡排序

此处以一个程序作为例子来进行演示:

//假设进行升序排序
#include<stdio.h>
int main()
{
	int arr[] = { 9,8,7,4,5,6,1,2,3,0 };//数组中有10个元素
	for (int i = 0; i < 9; i++)//i<9进行解释①
	{
		for (int j = 0; j < 9-i; j++)//i<9-i进行解释②
		{
			if (arr[j] > arr[j + 1])//满足条件进行交换
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
	for (int i = 0; i < 10; i++)//打印数组,检验排序结果
	{
		printf("%d  ", arr[i]);
	}
	return 0;
}
//下边对①②进行解释

①、i<9的解释

  此处的i几位冒泡排序进行的趟数。数组中共有10个元素,我们称每进行一次从头到尾的冒泡排序(两个相邻元素间进行比较交换(如上arr[j]>arr[j+1]))为一趟冒泡排序。那么当进行完第一趟冒泡排序后数组中最大的数就处于数组的最后一个元素了,以此类推,进行接下来的趟数排序,现在来思考共需要进行几趟冒泡排序:不难得出,当进行完第9趟排序后,数组中最小的数已经处于数组中第一个元素的位置。由此可知,假设数组中数的个数为(n){此处的n也可由操作符sizeof计算},那么共需要进行(n-1)趟冒泡排序,即可将所有的元素升序排列了!

②、j<9-i的解释

  此处的j作为交换对数来解释。例如数组总共有10个元素,两两进行比较交换,那么共需要有九对数进行比较交换(即arr[0]和arr[1]、arr[1]和arr[2]、······依次进行),现在按照程序运行逻辑进行:首先i=0,开始进行第一趟冒泡排序; j<9,数组下标从0-8依次两两进行比较交换(即数组下标:0.1,1.2,2.3,3.4,4.5,5.6,6.7,7.8,8.9)共进行9对数字间的交换,完成后数组中最大的数字就处在数组中最后一个元素的位置啦,至此第一趟冒泡排序结束。下边i=1,开始进行第二趟冒泡排序。此时j<8,数组下标0-7共进行8对(即0.1,1.2,2.3,3.4,4.5,5.6,6.7,7.8)数字间的交换,交换完成后数组中仅比最大数小的一个元素就处在倒数第二个元素的位置啦。依次向后进行,每进行一趟冒泡排序,那么接下来需要进行比较的数对的对数就要减少一对,所以这就是为什么j<9-i啦

二、冒泡排序写在函数中

1、自定义bubble_sort函数

同样采用上述代码,对其写入函数:

//继续以此程序来进行解释:
#include<stdio.h>
void bubble_sort(int arr[],int sz)//参数类型解释②
{
	for (int i = 0; i < sz-1; i++)
	{
		for (int j = 0; j <sz-1-i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}
int main()
{
	int arr[] = { 9,8,7,4,5,6,1,2,3,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);//变量sz位置及计算注意事项①
	bubble_sort(arr,sz);//参数类型解释②
	for (int i = 0; i < 10; i++)//输出交换后的数组
	{
		printf("%d  ", arr[i]);
	}
	return 0;
}

①、变量sz位置及计算注意事项

  首先是sz变量含义,计算出数组中元素的个数(数组的总大小初一数组中一个元素的大小)。注意事项:1.sz的位置不应放入bubble_sort函数中,在这里我们应当注意数组作为参数传递到bubble_sort函数中时是地址传递,若在函数中计算sz,实际上是计算了一个指针变量的大小除以一个整型的大小,其结果恒为一,明显错误了。因此在程序中应当将sz在bubble_sort函数外的主函数中计算出后将其作为一个参数传递给bubble_sort函数。

 ②、参数类型解释

  1.数组作为函数参数,其传递类型为指针传递*;2.整型sz注意事项(参照①)

  • 323
    点赞
  • 1468
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小s的s

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

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

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

打赏作者

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

抵扣说明:

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

余额充值