排序算法中的冒泡排序法

Posted ss-live

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法中的冒泡排序法相关的知识,希望对你有一定的参考价值。

遍历 — 样本筛选

有的时候,样本范围内的数据可能不是每一个我们都需要,而是只需要其中一部分,那么在遍历样本时,就需要对取出的每一个样本数据进行判断,看是否满足我们的需要,也就是要对样本进行筛选。

比如,输出1-10之间所有的奇数,虽然样本范围是1-10,但不是每一个样本数据都是我们需要的,因此,我需要对取出的每一个数据进行验证,看它是不是奇数,如果是,才输出。

可以使用下面的代码来完成输出1-10之间所有的奇数:

 

for (int i = 1; i <= 10; i++)
{
// 每一次进入循环体,i,就是取出的其中一个样本数据
// 判断该数据是不是奇数
if (i % 2 != 0)
{
Console.Write(i);// 该样本数据满足条件,输出
}
}

运行结果为:

13579

遍历 — 样本求和

有的时候,我们需要把样本范围内的所有数字相加,这就是求和问题。

面对求和的问题,可以使用这样的思路:在遍历之前,先准备好一个变量,值为0,然后取出样本的第一个数据,将变量的数据和第一个数据相加,然后再保存到变量中。然后对样本剩下的数据做同样的处理即可。

举个例子,比如让你对10-15之间的所有数字求和,可以使用如下的方案:

第一步:准备好一个变量,比如sum,让它的值为0

  • sum = 0;

第二步:将样本范围内的每一个数和变量sum中保存的值累加,然后再保存到sum中:

  • sum += 10; // sum:10
  • sum += 11; // sum: 21
  • sum += 12; // sum: 33
  • sum += 13; // sum: 46
  • sum += 14; // sum: 60
  • sum += 15; // sum: 75

第三步:当遍历结束后,变量sum中的值就是累加求和的结果。

把上面的例子转换为代码如下:

 

//第一步
int sum = 0;
//第二步
for (int i = 10; i <= 15; i++)
{
sum += i;
}
//第三步
Console.Write("和为:" + sum);

输出结果如下:

和为:75

这就是求和问题的做法,类似的累计问题也是同样的方案,比如求10-15之间所有数的乘积,可以使用下面的代码:

 

//第一步
int sum = 1; // 求乘积要从1开始
//第二步
for (int i = 10; i <= 15; i++)
{
sum *= i; // 使用累乘
}
//第三步
Console.Write("积为:" + sum);

运行结果为:

积为:3603600

遍历 — 样本计数

样本计数问题往往会和样本筛选问题合并使用。

它是指这么一种场景,有一个样本范围,需要计算该样本范围中满足条件的样本数据有多少个。

比如,55-66中有多少个数能同时被2和3整除。

可以使用如下的思路解决:

第一步,准备好一个变量num,该变量表示满足要求的样本数据数量,一开始的值为0。

  • int num = 0;

第二步,遍历样本,一个一个将样本数据拿出来,看看该样本数据是否满足要求,如果满足,将计数变量num自增1。

  • 55 不满足要求,什么也不做
  • 56 不满足要求,什么也不做
  • 57 不满足要求,什么也不做
  • 58 不满足要求,什么也不做
  • 59 不满足要求,什么也不做
  • 60 满足要求,num++ // num: 1
  • 61 不满足要求,什么也不做
  • 62 不满足要求,什么也不做
  • 63 不满足要求,什么也不做
  • 64 不满足要求,什么也不做
  • 65 不满足要求,什么也不做
  • 66 满足要求,num++ // num: 2

第三步,当遍历结束后,变量num中的值就是计数的结果。

把上面的例子转换为代码如下:

 

//第一步
int num = 0; // num表示计数的结果,在一开始,计数之前,为0
//第二步
for (int i = 55; i <= 66; i++)
{
if (i % 2 == 0 && i % 3 == 0)
{
num++;
}
}
//第三步
Console.Write("55-66中,共有" + num + "个数能同时整除2和3");

运行结果如下:

 

55-66中,共有2个数能同时整除2和3

计数问题有一个经典的场景,就是判断一个数是不是质数(素数)

什么是质数(素数)?质数(素数)是一个大于等于2的数,该数只能被1和自身整除。

这看上去不像是一个计数场景,甚至不像是任何一个遍历场景。

既然质数只能被1和自身整除,换句话说,在1到该数之间,一定只有两个数能整除该数。比如,7是一个质数,因为1-7之间,只有两个数(1和7)能整除它

仔细理解上面这段话,如果你理解了,就会发现这是一个什么问题?没错,这就是一个计数问题。

我们要判断一个数n是不是质数,只需要看1-n之间有多少个数能整除n,如果数目为2,它就是质数,否则,它就不是。

于是,可以使用下面的代码来判断:

 

int n = 3311; // 待判断的数n,假设它的值是3311

//下面是计数问题的代码
//第一步
int num = 0; //计数
//第二步,遍历范围1-n
for (int i = 1; i <= n; i++)
{
if (n % i == 0)
{
num++;//计数+1
}
}
//第三步,根据计数结果来判断
if (num == 2)
{
Console.Write(n + "是一个质数");
}
else
{
Console.Write(n + "不是一个质数");
}

执行结果:

3311不是一个质数







































































以上是关于排序算法中的冒泡排序法的主要内容,如果未能解决你的问题,请参考以下文章

冒泡排序法

三大基础排序算法(冒泡排序,选择排序,插入排序)

C语言冒泡排序法代码

java冒泡排序法代码

PHP 四种基本排序算法的代码实现

重温基础算法内部排序之冒泡排序法