数组排排队(冒泡排序及优化)

目录

引言

一、冒泡排序

1、了解数组:

2、构建思路:

3、代码实现:

二、优化及改进:

1、逆序排序

2、分装函数,广泛运用

三、结论


引言

       数字一个C语言中我们常见的符合数据类型,但它时常是再乱文章的没有顺序的。当我见到它的第一眼我就在想有什么办法能让它排序呢?经过我的学习与查询得以解决,那就让姜糖我来给大家分享一下吧。

一、冒泡排序

1、了解数组:

首先我们准备给数组排序,就应该先深入了解一下我们今天的主人公——数组。

在C语言中,数组是一种用于存储固定数量同类型元素的数据结构。数组中的每个元素都可以通过其索引(或下标)来访问,索引通常是一个非负整数。C语言中的数组在内存中占据一块连续的空间,因此可以通过计算基地址和偏移量来快速访问数组中的任意元素。

 数组的定义如下:

int arr[10];

2、构建思路:

        了解完数组后,我们就要开始编写代码的老传统——写前构思了。(先构思一下升序排列)

        首先让我们从排序的角度想问题,先来个简单的。如果有两个数如a和b放在你面前,试想一下你会怎么对它们进行升序排序呢?

        对了,很简单,先对它们比大小,然后交换顺序。 eg:(设置temp变量辅助交换)

if(a > b)
{
    temp = a;
    a = b;
    b = temp;
}

        那数据一旦多起来我们该怎么办呢?比如有10个数据。那我们也用交换的思路去想一下,不过这回是连续相邻的两两交换。10个数字就是10-1次两两交换。大家去试一下就会神奇的发现最大的那个数排到了整个队列的最后一个了,那么最大的一个数字我们就确定了。所以接下来我们对剩下9个数字进行连续两两交换,找出这其中最大的数字。以此内推,再排第n个数字时两两交换循环就是10-1-n。

        最后这个为了确定10个数字我们就要重复上面的操作10次,但是我们在循环最后第二次时自然而然的确定了第一个数字,所以只用进行10-1次。

3、代码实现:

举一个例子:

arr[10]={4,7,8,1,5,6,2,9,3,0};

那就让我们用代码去实现一下吧:

#include<stdio.h>

int main()
{
	int arr[10] = { 4,7,8,1,5,6,2,9,3,0 };
	int i;

	for (i = 0; i < 9;  i++)
	{
		int j;
		for (j = 0; j < 9 - i; j++)
		{
			int temp;
			if (arr[j] > arr[j + 1])
			{
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	

}

运行结果如下:

二、优化及改进:

1、逆序排序

       OK了,想必大家对冒泡排序算法,那之前讨论的都是升序排列那大家就动动自己的脑袋想一想逆序应该怎么排序呢?我先把代码交给大家,看看能不能发现他们之间的区别。

#include<stdio.h>

int main()
{
	int arr[10] = { 4,7,8,1,5,6,2,9,3,0 };
	int i;

	for (i = 0; i < 9;  i++)
	{
		int j;
		for (j = 0; j < 9 - i; j++)
		{
			int temp;
			if (arr[j] < arr[j + 1])
			{
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	

}

运行结果如下:

       嘿嘿嘿大家发现没有,其实也不难只是在比较相邻数字大小的时候改成了前一个小于后面一个的时候才进行交换而已。

2、分装函数,广泛运用

       大家想一想日常如果我们去排序一个数组的话,不可能每一个数组内都是10个数字。那我们能不能在这个运算代拿写成一个函数的形式去排序n个数字的数组呢?

       那就让我们想一下数组里的数字我们该怎么表示呢?

       有了:

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

       那我接下来把算法里面的10换成n放进函数里就行了,代码如下:

#include<stdio.h>

void bubblesort(int arr[], int n)
{
	int i;

	for (i = 0; i < n-1; i++)
	{
		int j;
		for (j = 0; j < n - 1 - i; j++)
		{
			int temp;
			if (arr[j] < arr[j + 1])
			{
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}

}


int main()
{
	int arr[10] = { 4,7,8,1,5,6,2,9,3,0 };
	int n = sizeof(arr) / sizeof(arr[0]);

	bubblesort(arr, n);


	int i;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	

}

在这段代码中,`bubbleSort` 函数接受一个整数数组 `arr` 和数组的长度 `n` 作为参数。它使用两个嵌套的循环来实现冒泡排序。外层循环控制排序的轮数,内层循环用于比较相邻的元素并交换它们(如果需要)。如果 `arr[j]` 大于 `arr[j+1]`,则交换这两个元素的位置。就完成啦。

三、结论

       冒泡排序这种算法的名字由来是因为较小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。而我姜糖则认为只要我不断的学习,不断充实我的气泡,也会不断向前向上被更多人了解。在此之前,大家能不能给姜糖一个三连支持一下吧,谢谢啦。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值