冒泡排序核心是外层控制轮数、内层控制比较范围且上限递减;升序时若arr[j] > arr[j+1]则交换,降序则改为arr[j]
冒泡排序的核心逻辑怎么写才不出错
冒泡排序本质是重复遍历数组,每次比较相邻两个元素,把较大(升序)的“冒”到末尾。关键不是嵌套循环本身,而是边界控制——外层循环控制轮数,内层循环控制每轮比较范围,且每轮后最大值已就位,所以内层上限要递减。
常见错误是内层循环写成
for (int j = 0; j ,导致越界访问或重复比较;正确写法是 <code>j (<code>i为外层轮数索引)。
- 升序时:若
arr[j] > arr[j + 1],交换- 降序时:改为
arr[j]- 数组长度为
n,最多需n-1轮,第i轮只需比较前n - i - 1对用 std::vector 还是原生数组?参数传递要注意什么
新手常直接传
int arr[],但 C++ 中数组名退化为指针,无法在函数内用sizeof算长度。推荐用std::vector<int>&</int>引用传参,既安全又支持动态大小。如果坚持用原生数组,必须额外传入长度参数,比如
void bubbleSort(int arr[], int n),否则函数内部根本不知道数组多长。立即学习“C++免费学习笔记(深入)”;
- 用
vector:可直接调用vec.size(),且自动管理内存- 避免值传递
vector,否则拷贝开销大;务必加&引用- 若函数声明为
void bubbleSort(const vector<int>& vec)</int>,则无法修改原数组——冒泡排序必须可变,所以不能加const如何提前终止优化性能
冒泡排序最差时间复杂度是 O(n²),但最好情况(已有序)可以优化到 O(n)。做法是在每轮遍历时设置一个标志位,记录本轮是否发生交换;若全程没交换,说明已有序,直接
break。这个优化不改变最坏复杂度,但对部分有序数据很实用,而且代码只多两行,值得加。
- 定义
bool swapped = false在外层循环开始前- 每次交换后设
swapped = true- 内层循环结束后,若
!swapped,直接return- 注意:不要在内层循环里一发现没交换就 break——那只是当前这一对,不代表整轮无交换
完整可运行示例(含测试输出)
下面是一个带提前终止、使用
vector的最小可用版本:#include <iostream> #include <vector> using namespace std; <p>void bubbleSort(vector<int>& arr) { int n = arr.size(); 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]) { swap(arr[j], arr[j + 1]); swapped = true; } } if (!swapped) break; } }</p><p>int main() { vector<int> nums = {64, 34, 25, 12, 22, 11, 90}; bubbleSort(nums); for (int x : nums) cout << x << " "; cout << endl; // 输出:11 12 22 25 34 64 90 }</p>真正容易被忽略的是:
swap函数来自<utility></utility>,但#include <iostream></iostream>在某些编译器下会间接包含它,不报错;但严格起见,应显式加#include <utility></utility>,否则换编译器可能失败。
0
0
相关文章
c++如何设置线程优先级_c++多线程性能调优【核心】
c++怎么解决中文乱码问题_c++编码转换方法【避坑】
c++中this指针怎么理解_c++类成员函数调用【避坑】
C++如何求最大公约数_C++自带__gcd函数及辗转相除法【数学】
c++如何获取当前函数名_c++宏__FUNCTION__应用【技巧】
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门AI工具
相关专题
const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。
546
2023.09.20
在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。
730
2023.08.02
int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
565
2024.08.29
javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
181
2023.11.23
本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。
145
2026.02.13
热门下载
相关下载
最新文章







