冒泡排序的 C 程序:C 中的冒泡排序

已发表: 2020-10-20

目录

介绍

数组的排序在计算机科学中占有极其重要的地位。 当需要按特定顺序排列数据时,会注意到它的实用性。 有不同种类的排序算法。 最常见和广泛使用的排序算法是冒泡排序。

C中的冒泡排序

冒泡排序中用于排序的技术简单易懂。 它所做的只是将当前元素与下一个元素进行比较,如果它大于或小于条件所指示的,则交换它。 该算法非常准确。 每次将一个元素与其他元素进行比较,直到找到它的位置,这称为一次通过。

该算法可与水中的气泡相媲美,因为它会过滤掉阵列状气泡的顶部。 在所有用于排序的算法中,冒泡排序是最简单和最慢的,时间复杂度为 O(n^2)。 但是,可以通过使用在交换完成时退出循环的标志变量来优化算法。 对数组进行排序时,冒泡排序的最佳情况可能是 O(n)。

例如,让我们取一个由五个数字组成的未排序数组,如下所示

13, 32,26, 34,9

冒泡排序将开始考虑前两个元素,并将比较它们以检查哪个更大。 在这种情况下,32 大于 13。所以这部分已经是 y 排序的。 接下来,我们将 32 与 26 进行比较。所以我们发现 32 大于 26,因此必须交换它们。 新数组看起来像

13、26、32、34、9

接下来,我们比较 32 和 34。我们知道它们已经排序。 因此,我们移动到最后两个变量 34 和 9。由于 34 大于 9,因此必须交换它们。

我们交换值并在第一次迭代后到达数组的末尾。 现在数组看起来像

13, 26. 32,9,34

第二次迭代后,数组看起来像

13、26、9、32、34

第三次迭代后,数组将变为

13,9,26,32,34

第四次迭代后,数组将完全排序

9、13、26、32、34

必读: C 中的项目理念

算法

这里我们假设数组有 n 个元素。 此外,我们假设交换值函数正在交换所有值以使数组编号按排序顺序排列。

开始冒泡排序(数组)

对于列表的所有元素

如果数组[i]> 数组[i+1]

交换值(数组[i],数组[i+1])

万一

结束

返回数组

结束冒泡排序

阅读:数据结构中的排序:类别和类型

伪代码

上面的算法很明显,每对数组元素之间都有一个比较,直到整个数组升序排序。 它可能会导致一些复杂性问题,例如当数组已经按升序排序时算法的结果。 为了缓解这个问题,我们将使用一个标志变量,它使我们能够查看是否有任何交换。 如果不再需要交换,我们将退出内部循环。

BubbleSort算法的伪代码可以写成如下

过程 BubbleSort(数组:数组中的项目)

迭代=数组.计数;

对于 k=0 迭代 1 做:

标志=假

对于 l=0 迭代-1 做:

如果 (数组[l]> 数组[l+1]) 那么

交换值(数组 [l],数组 [l+1])

标志=真

万一

结束

如果(未交换)则

休息

万一

结束

结束过程返回数组

让我们在 C 中尝试一个冒泡排序的示例程序

# 包括<stdio.h>

无效的主要

{

int 数组 [10], i, j, num

对于 (i=0; i<=9; i++)

{

scanf(“%d”, &array[i])

}

for(i=0;i<=9;i++)

{

for(j=0;j<=9-i;j++)

{

如果(数组[j]>数组[j+1])

{

数=数组[j];

数组[j]=数组[j+1];

数组[j+1]=num;

}

}

}

printf("排序后的数组是/n");

for(i=0;i<=9;i++)

{

printf(“%d”,&array[i])

}

}

如示例所示,此冒泡排序算法接受来自用户的 10 个数字并将其存储在数组中。 在下一部分中,有两个 for 循环。 外部循环运行 I 值,等于 0 到小于等于 9。 外循环的功能是处理必须与其他元素进行比较的值的所有元素。

外循环内部还有另一个循环。 它从 j=0 开始,一直运行到小于或等于 8。 在内部,有一个条件 if 语句比较并检查数组 [j] 是否大于数组 [j+1]。 如果满足条件,则数组[j] 和数组[j+1] 的值相互交换。

名称为 num 的变量用于此目的。 首先将array[j] 分配给num,然后将array[j+1] 分配给array[j],最后将num 分配给array[j+1]。 这个过程将一直持续到数组中的所有元素都按升序排序。 之后,打印排序后的数组。

冒泡排序的优化实现

我们有一个优化的冒泡排序算法来改进结果。 使用标志变量进行优化。 如果有交换,标志变量将保持 1,否则它将从循环中中断。 下面是C 语言中优化的冒泡排序程序。

#include<stdio.h>

无效的主要

{

int 数组 [10], i, j, num, flag=0;

对于 (i=0; i<=9; i++)

{

scanf(“%d”, &array[i])

}

for(i=0;i<=9;i++)

{

for(j=0;j<=9-i;j++)

{

如果(数组[j]>数组[j+1])

{

数=数组[j];

数组[j]=数组[j+1];

数组[j+1]=num;

标志=1;

}

如果(!标志)

{

休息;

}

}

}

printf("排序后的数组是/n");

for(i=0;i<=9;i++)

{

printf(“%d”,&array[i])

}

}

给定程序的执行方式类似于正常的冒泡排序程序。 唯一的变化是使用了标志变量。 最初,该标志设置为 0。但是,如果发生交换,则该标志变为 1。这意味着该数组仍需要再次检查。 另一方面,如果标志不为 1,则表示没有发生交换,我们退出内部循环,假设数组已经排序。 一旦执行,我们将得到与普通冒泡排序相同的结果。

时间复杂度

冒泡排序的最佳时间复杂度为 O(n)。 当数组已经排序时会发生这种情况。 当数组尚未排序时,最坏的情况是 O(n*n)。

阅读: Java 中的 12 大模式程序,你今天应该检查一下

接下来是什么?

如果您有兴趣了解有关 Java、全栈软件开发的更多信息,请查看 upGrad 和 IIIT-B 的全栈软件开发 PG 文凭,该文凭专为在职专业人士设计,提供 500 多个小时的严格培训,9 个以上的项目和任务、IIIT-B 校友身份、实用的实践顶点项目和顶级公司的工作协助。

踏上梦想的工作

升级和 IIIT-BANGALORE 的软件开发 PG 文凭
今天报名