冒泡选择法(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 👍.

相关推荐
电星托马斯8 小时前
C++中顺序容器vector、list和deque的使用方法
linux·c语言·c++·windows·笔记·学习·程序人生
march_birds14 小时前
FreeRTOS 与 RT-Thread 事件组对比分析
c语言·单片机·算法·系统架构
小麦嵌入式14 小时前
Linux驱动开发实战(十一):GPIO子系统深度解析与RGB LED驱动实践
linux·c语言·驱动开发·stm32·嵌入式硬件·物联网·ubuntu
jelasin15 小时前
LibCoroutine开发手记:细粒度C语言协程库
c语言
篝火悟者15 小时前
自学-C语言-基础-数组、函数、指针、结构体和共同体、文件
c语言·开发语言
神里流~霜灭17 小时前
蓝桥备赛指南(12)· 省赛(构造or枚举)
c语言·数据结构·c++·算法·枚举·蓝桥·构造
双叶83617 小时前
(C语言)单链表(1.0)(单链表教程)(数据结构,指针)
c语言·开发语言·数据结构·算法·游戏
艾妮艾妮18 小时前
C语言常见3种排序
java·c语言·开发语言·c++·算法·c#·排序算法
charlie11451419119 小时前
STM32F103C8T6单片机硬核原理篇:讨论GPIO的基本原理篇章1——只讨论我们的GPIO简单输入和输出
c语言·stm32·单片机·嵌入式硬件·gpio·数据手册
矿渣渣19 小时前
int main(int argc, char **argv)C语言主函数参数解析
c语言·开发语言