当前位置: 首页 > news >正文

<C++>冒泡排序、归并排序详解 时间复杂度 与应用

目录

一、冒泡排序(Bubble Sort)

1. 原理

2. 代码实现

3. 复杂度分析

4. 应用场景

二、归并排序(Merge Sort)

1. 原理

2. 代码实现

3. 复杂度分析

4. 应用场景

三、对比与选择

四、测试示例

例题应用

四、如何选择?

三、对比总结


一、冒泡排序(Bubble Sort)
1. 原理

冒泡排序通过 重复遍历数组,比较相邻元素,若顺序错误则交换它们。每一轮遍历将未排序部分的最大元素“冒泡”到正确位置。优化后可提前终止排序(若某次遍历无交换,说明已有序)。

2. 代码实现
#include <iostream>
#include <vector>void bubbleSort(std::vector<int>& arr) {int n = arr.size();bool swapped;for (int i = 0; i < n-1; i++) {swapped = false;for (int j = 0; j < n-i-1; j++) {if (arr[j] > arr[j+1]) {std::swap(arr[j], arr[j+1]);swapped = true;}}if (!swapped) break; // 提前终止优化}
}
3. 复杂度分析
  • 时间复杂度

    • 最好情况(已有序):O(n)

    • 平均和最坏情况:O(n²)

  • 空间复杂度:O(1),原地排序。

4. 应用场景
  • 小规模数据排序。

  • 检测数组是否有序(优化后)。

  • 教学用途,理解排序基础逻辑。

--------------------------------------------------------------------------------------------------------------------------

二、归并排序(Merge Sort)
1. 原理

归并排序采用 分治策略

  1. 分割:递归将数组分成两半,直到子数组长度为1。

  2. 合并:将两个有序子数组合并为一个有序数组,需额外空间。

2. 代码实现
#include <iostream>
#include <vector>// 合并两个有序子数组
void merge(std::vector<int>& arr, int left, int mid, int right) {std::vector<int> temp(right - left + 1);int i = left, j = mid + 1, k = 0;while (i <= mid && j <= right) {if (arr[i] <= arr[j]) temp[k++] = arr[i++];else temp[k++] = arr[j++];}while (i <= mid) temp[k++] = arr[i++];while (j <= right) temp[k++] = arr[j++];for (int p = 0; p < k; p++) {arr[left + p] = temp[p];}
}// 递归分割与合并
void mergeSort(std::vector<int>& arr, int left, int right) {if (left >= right) return;int mid = left + (right - left) / 2;mergeSort(arr, left, mid);mergeSort(arr, mid + 1, right);merge(arr, left, mid, right);
}// 包装函数
void mergeSort(std::vector<int>& arr) {mergeSort(arr, 0, arr.size() - 1);
}
3. 复杂度分析
  • 时间复杂度:所有情况均为 O(n log n)。

  • 空间复杂度:O(n),合并时需要临时数组。

4. 应用场景
  • 大规模数据排序,尤其内存充足时。

  • 需要稳定排序的场景(如数据库排序)。

  • 外部排序(处理超出内存的数据)。


三、对比与选择
特性冒泡排序归并排序
时间复杂度O(n²)(平均/最坏)O(n log n)
空间复杂度O(1)O(n)
稳定性稳定稳定
适用数据规模小规模大规模
额外空间需要
实现难度简单中等

选择建议

  • 冒泡排序:数据量小或已接近有序。

  • 归并排序:数据量大且需要稳定性,或内存不受限。


四、测试示例
int main() {std::vector<int> arr1 = {64, 34, 25, 12, 22, 11, 90};bubbleSort(arr1);std::cout << "Bubble Sort Result: ";for (int num : arr1) std::cout << num << " ";std::cout << "\n";std::vector<int> arr2 = {38, 27, 43, 3, 9, 82, 10};mergeSort(arr2);std::cout << "Merge Sort Result: ";for (int num : arr2) std::cout << num << " ";std::cout << "\n";return 0;
}

输出

Bubble Sort Result: 11 12 22 25 34 64 90 
Merge Sort Result: 3 9 10 27 38 43 82 

例题应用
  1. LeetCode 148. 排序链表

    • 题目要求:在 O(n log n) 时间内对链表排序。

    • 解法:归并排序(适合链表的递归分治)。

    cpp

  • ListNode* mergeSort(ListNode* head) {if (!head || !head->next) return head;ListNode* slow = head, *fast = head->next;while (fast && fast->next) {slow = slow->next;fast = fast->next->next;}ListNode* mid = slow->next;slow->next = nullptr;return merge(mergeSort(head), mergeSort(mid));
    }

  • 逆序对问题(LeetCode 493. 翻转对)

    • 题目要求:统计数组中满足 nums[i] > 2 * nums[j] 的逆序对。

    • 解法:归并排序过程中统计逆序对。

    cpp

int count = 0;
void mergeAndCount(vector<int>& nums, int left, int mid, int right) {// ...合并逻辑...// 在合并前统计逆序对int i = left, j = mid + 1;while (i <= mid && j <= right) {if ((long)nums[i] > 2 * (long)nums[j]) {count += mid - i + 1;j++;} else {i++;}}
}

四、如何选择?

  1. 数据规模小 → 冒泡排序(或插入排序)。

  2. 数据规模大 → 归并排序(或快速排序)。

  3. 需要稳定性 → 归并排序。

  4. 内存有限 → 冒泡排序(原地排序)。



三、对比总结

特性冒泡排序归并排序
时间复杂度O(n²)(最坏/平均)O(n log n)(所有情况)
空间复杂度O(1)(原地排序)O(n)(需额外空间)
稳定性稳定稳定
适用场景小数据、部分有序数组大规模数据、外部排序

 

相关文章:

  • 开源库测试
  • [逆向工程]什么是“暗桩”
  • 代码随想录第34天:动态规划7(打家劫舍问题:链式、环式、树式房屋)
  • (done) 整理 xv6 文件系统 inode 层函数
  • android zxing QrCode 库集成转竖屏适配问题
  • 访问者模式(Visitor Pattern)
  • 【Springboot知识】Springboot计划任务Schedule详解
  • Dify - Embedding Rerank
  • 第六章 流量特征分析-蚁剑流量分析(玄机靶场系列)
  • 基于YOLOv8与LSKNet的遥感图像旋转目标检测新框架 —LSKblock注意力机制在小目标检测中的性能优化与SOTA探索
  • TCP/IP, CAN,LIN,SOCKET
  • 学习黑客Nmap 实战
  • Python字符串全面指南:从基础到高级操作
  • 代码随想录算法训练营Day45
  • MCP原理详解及实战案例(动嘴出UI稿、3D建模)
  • GESP2024年3月认证C++八级( 第二部分判断题(6-10))
  • 用Python打造自己的专属命令行工具
  • AI融合SEO关键词优化
  • BC35 判断字母
  • 【AI论文】KeySync:一种在高分辨率下实现无泄漏唇形同步的稳健方法
  • 青岛双星名人集团董事长发公开信称家人逼迫交出管理权?公司回应
  • “鱼米之乡”江苏兴化的产业哲学:以融合与创新重构价值链条
  • 以总理:在加沙地带扩大的军事行动将是“高强度”的
  • 国产基因测序仪龙头华大智造业绩持续承压,今年有望迎来拐点?
  • “五一”从昆明机场出境1.4万人次,较去年增长7.7%
  • 贵州黔西市游船倾覆事故发生后,多家保险公司紧急响应