冒泡排序原理和C++代码实现

本文介绍了一种简单直观的排序算法——冒泡排序。通过不断比较并交换相邻元素的位置来达到排序的目的。文章详细阐述了其算法步骤、复杂度分析及稳定性,并提供了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

冒泡排序是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

算法步骤

1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

3.针对所有的元素重复以上的步骤,除了最后一个。

4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

复杂度分析:

时间复杂度:

冒泡排序算法的每一轮要遍历所有元素,轮转的次数和元素数量相当,所以时间复杂度是O(N^2)

经过优化后,最优的情况,序列已经是顺序的,那么只要进行一次循环,所以最优时间复杂度是O(N)

空间复杂度:

冒泡排序算法排序过程中需要一个临时变量进行两两交换,所需要的额外空间为1,因此空间复杂度为O(1)

稳定性:

冒泡排序算法在排序过程中,元素两两交换时,相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法

代码实现:

void bubble_sort(T arr[], int len)
{
    int i, j;
    for (i = 0; i < len - 1; i++)//i轮排好后i+1个元素
        for (j = 0; j < len - 1 - i; j++)
            if (arr[j] > arr[j + 1])//稳定排序
                swap(arr[j], arr[j + 1]);
}

图源出处:1.1 冒泡排序 | 菜鸟教程

### 冒泡排序算法的工作原理 冒泡排序是一种基础的比较排序算法,其核心思想是通过重复遍历待排序的数组或列表,依次比较相邻元素,并在必要时交换它们的位置,以确保较大的元素逐渐向后移动,较小的元素向前移动。这一过程类似于“气泡”从底部上升到顶部[^1]。 具体来说,冒泡排序的执行流程如下: - 从数组的第一个元素开始,依次比较相邻两个元素。 - 如果前一个元素大于后一个元素,则交换它们;否则保持不变。 - 每一轮遍历结束后,最大的未排序元素会移动到它正确的位置(即数组末尾)。 - 重复上述过程,直到整个数组没有发生任何交换,表示已经有序[^2]。 冒泡排序的时间复杂度为 $O(n^2)$,其中 $n$ 是数据量。当输入数组已经是有序的时,时间复杂度可以优化至 $O(n)$,因为只需要一次遍历即可确定无需交换。空间复杂度为 $O(1)$,因为它是一个原地排序算法[^4]。 ### C++ 实现示例代码 以下是使用 C++ 编写的冒泡排序实现代码,包含优化机制:如果某一轮遍历中没有发生任何交换,说明数组已经有序,程序将提前终止[^3]。 ```cpp #include <iostream> using namespace std; void bubbleSort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { bool swapped = false; for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { // 交换相邻元素 int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; swapped = true; } } // 如果本轮无交换,说明已有序,提前退出 if (!swapped) break; } } int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int n = sizeof(arr) / sizeof(arr[0]); bubbleSort(arr, n); cout << "排序后的数组: "; for (int i = 0; i < n; i++) { cout << arr[i] << " "; } cout << endl; return 0; } ``` 该实现不仅逻辑清晰,还通过 `swapped` 标志提升了性能,在接近有序的数据集中表现更佳[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值