泡点排序和选择排序都是基于比较的排序算法,可以通过它们用于排序的方法加以区分。但在了解它们之间的主要区别之前,让我们先了解这两种算法的工作原理。
我们在本文中进一步列出了差异表。
内容表
- 气泡排序的基础知识
- 选择排序的基础知识
- 泡沫排序和选择排序的主要区别
- 总结
- 测试你的知识
- 总结
气泡排序的基础知识
冒泡排序是一种基于比较的排序算法,包括在输入数组上进行传递,在每一次传递中,如果相邻的元素没有按照要求的顺序(升序或降序)出现,就会被交换。它不断地进行传递,直到整个数组被排序完毕。
气泡排序算法(按升序排列)
- 从第一个索引开始,比较前两个元素。如果第一个元素大于第二个元素,就把它们交换;否则就保持原样。
- 现在,比较接下来的两个元素。如果它们的顺序不一致,就把它们换掉。这个过程一直持续到最后一个元素。
第一遍完成了--最大的元素将在数组的最后。
- 同样的过程将持续到其余的传递。每一次传递后,未排序的元素中最大的元素被放在最后。
在每一次传递中,比较都要进行到最后一个未排序的元素。当所有未排序的元素被放置在各自正确的位置时,数组就被排序了。
***优化的泡沫排序。*如果在一次传递中,我们没有进行任何交换,那么我们就不需要再进行任何传递。
逐次迭代的泡泡分类可视化

Java中的泡沫排序代码
public static void bubbleSort(int arr[])
{
int n = arr.length;
for (int i = 0; i < n - 1; i++)
for (int j = 0; j < n - i - 1; j++)
if (arr[j] > arr[j + 1]) {
// swap arr[j+1] and arr[j]
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
选择排序的基础知识
选择排序也是一种基于比较的排序算法,它涉及到将给定的数组划分为两个部分:
- 已排序的子数组,它最初是空的
- 未排序的子数组,最初包含所有的元素
考虑到我们要对数组进行升序排序。
在每次迭代中,我们从未排序的子数中挑选最小的元素,并将其放在已排序的子数的末尾。我们重复这整个过程,直到未排序的数组变成空。
选择排序算法(按升序排列)
反复从未排序的子数组中选择最小的元素,并将其交换到适当的索引:
- 找到数组中最小的一项,并将其与第一项交换。
- 找到数组中下一个最小的元素,并将其与下一个元素互换。
- 继续,直到数组中的所有项都被排序。
选择排序的逐个迭代可视化

Java中的选择排序代码
void selectionSort(int arr[])
{
int n = arr.length;
for (int i = 0; i < n-1; i++)
{
// Finding the minimum element in each loop
int min_idx = i;
for (int j = i+1; j < n; j++)
if (arr[j] < arr[min_idx])
min_idx = j;
// Putting the minimum element at correct position
int temp = arr[min_idx];
arr[min_idx] = arr[i];
arr[i] = temp;
}
}
气泡排序和选择排序的主要区别
以下是用于判断两种算法之间差异的参数。
功能性
冒泡排序比较相邻的元素,并相应地交换它们,而选择排序从未排序的子阵列中选择最小的元素,并将其放在已排序子阵列的下一个位置。
效率
冒泡排序和选择排序之间的另一个主要区别是,选择排序比冒泡排序更有效率。
速度
选择排序比冒泡排序更快,因为它需要较少的比较次数。
方法
冒泡排序和选择排序之间的另一个区别是,冒泡排序使用项目交换方法,而选择排序使用项目选择方法。
稳定性
冒泡排序是一种稳定的算法,在这种算法中,相等元素之间的相对顺序将被保持。选择排序是一种不稳定的算法。
然而,选择排序可以通过在比较和排序时加入相等元素的索引而变得稳定。但是,这将导致空间复杂度从O(1)增加到O(N),其中N是数组的大小。
气泡排序的稳定性

迭代性
选择排序是一种非迭代算法,而冒泡排序是一种迭代算法。
降序
- 选择排序算法可以将列表中的给定元素按升序或降序排序。
- 泡沫排序算法对列表中的给定元素按升序排序,然后将列表反转,以便按降序打印数组中的元素。
时间复杂度
这两种算法的时间复杂度如下。
最佳情况。
- **选择排序。**最佳情况下的复杂度是O(N^2),因为要在每次迭代中找到最小元素,我们必须遍历整个未排序的数组。
- **泡沫排序。**最佳情况下的复杂度是O(N)。它发生在我们有一个已经排序的数组时。我们将不得不运行一次迭代(N-1次比较)来确定这一点。在这种情况下,时间复杂度将是O(N)。
最坏的情况。
- **选择排序。**最坏情况下的复杂度是O(N^2),因为我们将不得不遍历整个未排序的数组,以便在每个迭代中找到最小元素。
- **泡沫排序。**最坏情况下的复杂度是O(N^2)。它发生在我们有一个反向排序的数组,在这种情况下,我们将不得不进行(N-1)次传递,其中N是数组中存在的元素数量。
平均情况。
对于随机数据集,两种算法的时间复杂度都是O(N^2)。
应用
- 选择排序可以对一个链表进行排序,因为我们可以有效地移除最小的元素,并将其追加到排序后的列表中。
- 泡点排序用于检测已排序数据集中的小错误,并对几乎已排序的数据集进行快速排序。
总结:冒泡排序与选择排序
冒泡排序和选择排序的主要区别在于,冒泡排序的操作方式是,如果相邻元素的顺序不对,就反复交换它们。相反,选择排序是通过反复从未排序的部分中找到最小的元素(或者,如果我们想按降序排序,则是最大的元素),并将其放在数组的开始位置来排序。
| 参数 | 气泡排序 | 选择排序 |
|---|---|---|
| 功能特点 | 相邻的元素被比较和 | |
| 互换 | ||
| 最大/最小的元素被选中并 | ||
| 与最后一个元素交换 | ||
| (在升/降序的情况下)。 |
|
| 效率高 | 效率较低 | 效率较高 |
| 速度 | 较慢 | 更快 |
| 比较的数量 | 大 | 较少 |
| 方法 | 交换 | 选择 |
| 稳定的 | 有 | 不稳定 |
| 适应性强 | 是 | 没有 |
| 在位 | 是 | 是 |
| 迭代性 | 迭代算法 | 非迭代算法 |
| 降序排列 | 数组首先以升序排序
,然后反过来
以
降序
显示元素
。
| 可以对
数组
中的给定元素
按升序
或降序排序。
|
| 最佳情况下的时间复杂度 | O(N) | O(N^2) |
| 最坏情况下的时间复杂度 | O(N^2) | O(N^2) |
| 平均情况下的时间复杂度 | O(N^2) | O(N^2) |
| 空间复杂度 | O(1) | O(1) |
| 应用 | 有助于检测
几乎排序的
数据集中
的
小错误
| 可以应用于链接的
列表
|
| 优势 | 最简单的稳定原地排序
算法
| 当交换操作
成本较高时
有效 |
| 劣势 | 对大型
数据集
来说效率很低 | 不具备可扩展性 |
测试你的知识
问题1
给定的数组是arr = {1, 2, 4, 3}。泡点排序是用来对数组元素进行排序的。将进行多少次迭代来对该数组进行排序?
4
2
1
0
尽管前两个元素已经被排序,但是冒泡排序需要4次迭代来对给定数组进行排序。你怎样才能提高冒泡排序的最佳效率?(输入已经被排序)
问题2
冒泡排序算法的空间复杂度将是多少?
O(N)
O(2^N)
O(1)
O(N^2)
除了已经用于存储原始数组和用于交换数组元素的临时变量外,没有使用额外的空间/内存。排序是直接在原始数组上完成的。这个符号是用来说明恒定的空间复杂性的。
问题3
选择排序的平均情况复杂度是多少?
O(N^2)
O(NlogN)
O(logN)
O(N)
在平均情况下,即使输入被部分排序,选择排序的行为就像整个数组没有被排序一样。选择排序对输入是不敏感的。
问题4
选择排序的缺点是什么?
它不具有可扩展性
它需要辅助内存
它可以用于小键
它需要线性时间来排序元素
随着输入大小的增加,选择排序的性能会下降。
问题5
给定的数组是arr = {3,4,5,2,1}。请分别找出冒泡排序和选择排序的迭代次数。
5和4
4和5
2和4
2和5
由于输入数组没有被排序,所以冒泡排序需要5次迭代,选择排序需要4(n-1)次迭代。
总结
在OpenGenus的这篇文章中,我们学习了使用选择排序和冒泡排序的概念,了解了选择排序和冒泡排序的主要区别,如用于排序的方法,它们的效率、稳定性、功能、时间的复杂性、速度、应用等。