冒泡选择法(c基础)

时间:2024-11-10 13:53:01

适合对象c语言初学者。

冒泡选择法

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

核心要点

1: 数组元素个数 sz

2: 比较后的交换。

核心思路

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

代码产生

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

2:进行第一趟排序

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

比较很简单。

只需挨着的两个比就行。

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

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

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

于是有

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

结果为

观察发现5变到后面了。

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

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

开始循环

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

运行结果:

ok.

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

经观察发现不是。

如果我把5改成4呢

显而易见,可以。

于是我们可以优化一下。

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

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

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

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

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

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

当交换时为假,反之为真

于是进去时把flag变为真

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

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

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

结果:

归纳为一般情况

先求数组元素个数sz

把5改成sz即可。

如下

#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;
}

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

//生成随机数填数组再排序
#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基础)-****博客

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