冒泡选择法(c基础)

适合对象c语言初学者。

冒泡选择法

作用对一个数组进行排序。(介绍一下数组(c基础)(详细版)-CSDN博客

核心要点

1: 数组元素个数 sz

2: 比较后的交换。

核心思路

进行(sz - 1)趟,每一趟把最大数的放到末尾。其余数向前挪一个。

代码产生

1:先创建一个无序数组。

2:进行第一趟排序

那么如何比较与挪一个呢?

比较很简单。

只需挨着的两个比就行。

于是我们创建一个变量方便访问数组中的一个数。

其实挪一个只需让值交换就行

这就相当与交换a与b的值,只是变成数组了。

于是有

此时就完成了一趟排序。介绍一下for break continue 函数(c基础)_for语句中continue跳过表达式三吗-CSDN博客

结果为

观察发现5变到后面了。

易发现:最大数到末尾后,便不在管他。产生新的末尾与最大数。

于是我们创建新的变量表示循环趟数。

开始循环

欧克,很简单,相较于上次,只是套了一个循环而已。

运行结果:

ok.

但我们真的一定需要(5 - 1)(sz-1)趟吗?

经观察发现不是。

如果我把5改成4呢

显而易见,可以。

于是我们可以优化一下。

当他是顺序时就跳出循环。总结一下break continue(c基础)_简述跳转语句break与continue的作用和区别。段落格式字体字号-CSDN博客

于是我们想把break;插进去。

进行交换 break;就不产生作用,反之就产生。

于是考虑到用if语句。简单介绍一下 if else else if 函数(c基础)_if else算函数吗-CSDN博客

if要一个(),所以创建一个变量。

显然if语句要在交换后面。

当交换时为假,反之为真

于是进去时把flag变为真

如果进行交换,把flag值变为假。

这样当他是顺序时显然不会进行交换了。

(对36有疑问,c语言中真假情况_cyy数轴内打印真假-CSDN博客

结果:

归纳为一般情况

先求数组元素个数sz

把5改成sz即可。

如下

cs 复制代码
#include<stdio.h>
int main()
{
	//创建一个无序数组。
	int arr[] = { 5,2,0,3,6 };

	//求数组元素个数
	int sz = 0;
	sz = sizeof(arr) / sizeof(arr[0]);

	//进行第一趟排序。
	
	//创建一个变量方便访问数组中的一个数。
	int j = 0;

	//开始比较
	for (j = 0; j < sz - 1; j++)
	{
		if (arr[j] > arr[j + 1])
		{
			int temp = 0;
			temp = arr[j];
			arr[j] = arr[j + 1];
			arr[j + 1] = temp;
		}
	}

	//创建一个新的变量表示循环趟数。
	int i = 0;
	//创建一个变量控制break;
	int flag = 0;
	
		 for (i = 0; i < sz - 1; i++)
		 //开始比较
		 for (j = 0; j < sz - 1; j++)
		 {
			 //把flag的值变为真。
			 flag = 36;

			 if (arr[j] > arr[j + 1])
			 {
				 int temp = 0;
				 temp = arr[j];
				 arr[j] = arr[j + 1];
				 arr[j + 1] = temp;
				 //把flag的值变为假。
				 flag = 0;
			 }
			 if (flag)	break;
		 }

	for (j = 0; j < 5; j++)
	printf("%d ", arr[j]);

	return 0;
}

下面是创建随机数,进行排序的代码(拓展)

cs 复制代码
//生成随机数填数组再排序
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define NUM 3
int main()
{

	int arr[NUM];
	int i = 0;
	srand((unsigned int)time(NULL));

	for (i = 0; i < NUM; i++)
	{
		arr[i] = rand() % 100 + 1;

	}
	int n = 0;
	for (n = 1; n < NUM - 1; n++)
	{
		int j = 0;
		int flag = 0;
		for (j = 0; j < NUM - n; j++)
		{
			flag = 0;
			if (arr[j] > arr[j + 1])
			{
				arr[j] = arr[j] + arr[j + 1];
				arr[j + 1] = arr[j] - arr[j + 1];
				arr[j] = arr[j] - arr[j + 1];
				flag = 1;
			}
		}
		if (0 == flag) break;
	}
	for(i = 0; i < NUM; i++)
	printf("%d\n", arr[i]);

	return 0;
}

看了就行。

介绍一下如何生成随机数(c基础)-CSDN博客

Hi I am 36,thanks for your reading.I am looking forward your 👍.

相关推荐
小林熬夜学编程11 分钟前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
Jackey_Song_Odd23 分钟前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
A懿轩A2 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
半盏茶香2 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
字节高级特工3 小时前
【C++】深入剖析默认成员函数3:拷贝构造函数
c语言·c++
计算机学长大白4 小时前
C中设计不允许继承的类的实现方法是什么?
c语言·开发语言
XH华9 小时前
初识C语言之二维数组(下)
c语言·算法
Uu_05kkq12 小时前
【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符
c语言·数据结构·算法
嵌入式科普15 小时前
十一、从0开始卷出一个新项目之瑞萨RA6M5串口DTC接收不定长
c语言·stm32·cubeide·e2studio·ra6m5·dma接收不定长
A懿轩A15 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列