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

相关推荐
代码中介商6 小时前
银行管理系统的业务血肉 —— 流程、状态机、输入校验与持久化(下篇)
c语言·算法
爱编码的小八嘎8 小时前
C语言完美演绎9-12
c语言
Navigator_Z10 小时前
LeetCode //C - 1031. Maximum Sum of Two Non-Overlapping Subarrays
c语言·算法·leetcode
leoufung16 小时前
LeetCode 30:Substring with Concatenation of All Words 题解(含 C 语言 uthash 实现)
c语言·leetcode·c#
爱编码的小八嘎16 小时前
C语言完美演绎9-6
c语言
SunnyByte17 小时前
线性表——单链表的增删查改操作
c语言·单链表
SunnyByte17 小时前
线性表——双向链表
c语言·链表
jimy117 小时前
C 语言的 static 关键字作用
c语言·开发语言·算法
handler0118 小时前
算法:图的基本概念
c语言·开发语言·c++·笔记·算法·图论
木木_王18 小时前
嵌入式Linux学习 | 数据结构 (Day03)顺序表与单链表 超详细解析(含 C 语言实现 + 作业 + 避坑指南)
linux·c语言·数据结构·学习