记冒泡排序中出现的i++问题

博主在研究排序算法时遇到冒泡排序的一个问题,发现在使用i++时程序无法得到预期结果。经过排查,发现这是由于i++作为后缀运算符在表达式中最后执行,导致条件判断出错。改用i+1后,程序运行恢复正常。此篇博客探讨了这一细节,并提醒开发者注意此类陷阱。

    因为之前写排序问题时,用不好冒泡排序,因此抽出一段时间进行训练,发现有个很有意思的问题,使用i++时无法出现正常结果,如图1。

图1

 

但是将其改为i+1后程序正常运行。

原因是由于i++为最后运算导致无法进入if。

冒泡排序是一种基础的排序算法,它通过不断交换相邻的元素,将较大的元素逐步"浮"到待排序列的尾部,从而实现排序[^2]。下面是一个基本的C++实现: ```cpp #include <iostream> using namespace std; void bubbleSort(int arr[], int n) { 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], arr[j+1]); } } } } int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int n = sizeof(arr)/sizeof(arr[0]); cout << "排序前的数组:\n"; for (int i=0; i < n; i++) cout << arr[i] << " "; cout << endl; bubbleSort(arr, n); cout << "排序后的数组:\n"; for (int i=0; i < n; i++) cout << arr[i] << " "; cout << endl; return 0; } ``` 这段代码中,`bubbleSort` 函数实现了冒泡排序算法。外层循环控制排序的轮数,内层循环负责比较和交换相邻元素。如果当前元素大于下一个元素,则交换它们的位置。 为了更好地理解排序过程,可以像下面这样修改代码以统计并输出排序过程中执行的轮数: ```cpp void sort1(int *buf, int len) { int cnt = 0; // 用来计数,看看执行了多少次 for (int i = 0; i < len; ++i) { for (int j = 0; j < len - i - 1; ++j) { if (buf[j] > buf[j + 1]) { int temp = buf[j]; buf[j] = buf[j + 1]; buf[j + 1] = temp; } } ++cnt; // 在这里录外层循环的次数 } cout << "一共执行了:" << cnt << endl; } int main(int argc, char* argv[]) { int buf1[] = { 5,0,1,2,3,4 }; sort1(buf1, sizeof(buf1) / sizeof(int)); return 0; } ``` 此外,如果需要对浮点数数组进行冒泡排序,可以调整比较函数以适应浮点数的特性,如下面的示例所示: ```cpp // 浮点数改进版 void dBubbleSort(double arr[], int len) { int round = 0; int cIndex = 0; double temp = 0.0; for (round = 1; round < len; round++) { for (cIndex = 0; cIndex < len - round; cIndex++) { if (arr[cIndex + 1] > arr[cIndex]) { temp = arr[cIndex]; arr[cIndex] = arr[cIndex + 1]; arr[cIndex + 1] = temp; } } } } ``` 这些示例展示了冒泡排序的基本实现和一些简单的变体,可以根据具体需求进行调整和优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值