冒泡排序及其优化

一、前期准备

冒泡排序的实质
冒泡排序大的实质也就是其核心思想就是相邻元素的两两比较。当然想要应用冒泡排序还是要有一些前期的准备的。

1、数组

数组就是有些相同数据类型的数据集合。这个概念可以类比数学中的集合来理解。
对于数组还需要知道数组传参的本质,数组传递参数实际上是传递数组首元素的地址,因此在函数内接收的时候,就需要用指针来接收。比如从主函数中传递来了一个数组,函数的接收就应该写成ElemType * 数组名来接受(ElemType 是指数组具体的类型,例如int char之类的),不过为了更容易理解c语言规定可以使用**ElemType 数组名[ ]**来用来接收数组,但是实际上还是和前者一样,只不过可以让使用者清楚的知道这就是个数组。具体的数组传参就先不赘诉。

2、数组长度

数组长度就是用操作符sizeof来测出来的

int n = sizeof(arr) / sizeof(arr[0]);

这行代码就可以测出数组arr的长度,第一个sizeof中使用的是arr这个数组名,它其实是整个数组的长度,这也是唯二使用arr时不是首元素的地址的情况。当然也是可以使用strlen这个函数直接来求数组长度的。

3、交换两个数的次序

这个我在之前的一篇文章中讲过,所以直接就放链接了。http://t.csdn.cn/Q6Fmm

二、冒泡排序

1、设计思路

利用冒泡排序的实质,相邻的两个数相比较较大的往后放这种设计思路,然后利用循环来依次实现排序。

2、代码实现(变成升序排序)

#include <stdio.h>
#define MaxSize 100

void Print(int arr[], int n);
void Bubbling(int arr[], int n);
void Bubbling(int arr[], int n)
{
	int i = 0, j = 0;
	for (i = 0; i < n; i++)
	{
		//这里的j < n - j - 1,是因为前面排过序的就不用再排了
		for (j = 0; j < n - i - 1; j++)
		{
		    if(arr[j] > arr[j + 1]{
				int tem = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tem;
			}
		}
		//为了更加清楚的显出来,这里每一次之后就都打印出来,以便于观察
		printf("第%d次排序:\n", i+1);
		Print(arr, n);
	}
}

void Print(int arr[], int n)
{
	for (int i = 0; i < n; i++)//顺序打印数组的元素
	{
		printf("%d ", arr[i]);
	}
	printf("\n");//全部打印之后换行
}
int main(void)
{
	int arr[MaxSize] = { 0 };//数组初始化
	int n = 0;//控制输入个数的变量
	printf("请输入数字个数:\n");
	scanf("%d", &n);

	for (int i = 0; i < n; i++)//自行输入数组元素
	{
		scanf("%d", &arr[i]);
	}
	printf("原来的结果为:\n");
	Print(arr, n);//传递参数给打印函数,打印未排序前的序列

	Bubbling(arr, n);//调用排序数组,进行排序
	printf("最后输出结果为:\n");
	Print(arr, n);//再次调用打印函数,输出排序后的数组

	return 0;
}

在这里插入图片描述
上图就是所运行的结果,过程清晰明了。

3、代码优化

上述情况具有特殊性,下面来看,一个随机的排序在这里插入图片描述
这样的情况下,前面的排序就会显得十分多余。
那么下面将代码进行优化

//优化后
void Bubbling(int arr[], int n)
{
	int i = 0, j = 0;
	int flag = 1;//设置一个flag 变量来控制
	//如果不需要交换,就直接跳过
	for (i = 0; i < n; i++)
	{
		//这里的j < n - j - 1,是因为前面排过序的就不用再排了
		flag = 1;//假设这一次已经有序了
		for (j = 0; j < n - i - 1; j++)
		{
			if (arr[j] > arr[j + 1]) {
				flag = 0;//如果发生交换,就说明无序
				int tem = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tem;
			}
		}
		if (flag == 1) {
			printf("\n");//换行与上面的结果区分开来
			Print(arr, n);
			break;
		}
		//这个else是可以不用写的,我这里写是为了更好的展示整个过程
		else
		{
			printf("进行了调整\n");
			Print(arr, n);
		}
	}
}

优化后的结果如下:
在这里插入图片描述

这样就实现了代码的优化。
个人拙见,如有更好的想法请不吝赐教。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

十月三十二号的风情

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

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

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

打赏作者

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

抵扣说明:

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

余额充值