You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:54:03