C语言如何实现vector降序排序?自定义冒泡排序运行失效求助
代码问题分析
- 数组访问越界:你代码中for循环的终止条件是
i < n,当i取值为n-1时,会访问v[i+1]也就是v[n],而vector的合法下标范围是0到n-1,越界访问会触发未定义行为,可能导致程序崩溃或得到错误的排序结果。 - 循环终止逻辑错误:当前的
while(ok != 0)条件完全不符合冒泡排序的逻辑:do块内初始化ok=1,如果本轮排序发生了元素交换,ok会被赋值为0,此时循环条件不满足会直接退出,根本无法完成多轮排序。正确逻辑是只要本轮发生过交换,就说明序列还未完全有序,需要继续下一轮排序,所以循环条件应该改为while(ok == 0)。
你注释中标记的if(v[i]<v[i+1])判断逻辑是正确的,降序排序确实需要将更小的前元素和后元素交换,这行没有问题。
正确实现方案
方案1:修复现有冒泡排序代码
修正边界和循环条件后的代码如下:
do{ ok = 1; // 边界修改为n-1,避免i+1越界 for(int i = 0; i < n-1; i++) { if(v[i] < v[i+1]) { int x = v[i]; v[i] = v[i+1]; v[i+1] = x; ok = 0; } } // 本轮有交换(ok=0)时继续循环 } while(ok == 0);
方案2:使用STL标准库排序(更推荐)
手动实现冒泡排序的效率极低,实际开发中直接调用标准库的sort函数即可,代码更简洁、排序效率更高:
#include <algorithm> #include <vector> // 假设你的vector声明为std::vector<int> v std::sort(v.begin(), v.end(), std::greater<int>());
如果你的vector存储的是其他数据类型,将std::greater的模板参数替换为对应类型即可。
内容的提问来源于stack exchange,提问作者Juhász Koppány
相关产品推荐
相关产品推荐

