适合对象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;
}
看了就行。
Hi I am 36,thanks for your reading.I am looking forward your 👍.