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

std::vector版快速排序无效:原因解析及修复方案

问题原因分析

我一眼就瞅到几个关键问题,导致排序后原数组完全没变化:

  • 传值传递导致修改无效:你的quickSort和printArray函数里,vector<int> array是按值传递的——也就是说,每次调用函数都会创建一个原vector的副本,函数里做的排序操作全是在这个副本上折腾,原数组根本没被碰过!这就像你拿一份文件复印件改半天,原件当然纹丝不动。
  • vector长度计算错误:sizeof(array)/sizeof(array[0])这是给C风格数组算长度的写法,vector是C++容器,sizeof(array)得到的是vector对象本身的内存大小(不是元素总字节数),所以你算出来的n是错的,应该用array.size()来获取元素个数。
  • 排序边界参数错误:调用quickSort(array, 0, n)的时候,high参数传了n,但vector的索引是从0到n-1,传n会让函数里访问array[j]时越界,属于未定义行为,运气差的话程序直接崩了。
修复后的完整代码

把参数改成引用,修正长度计算和边界,代码就正常了:

#include <iostream>
#include <vector>
using namespace std;

// 改成传const引用,避免拷贝,同时保证不修改原数组
void printArray(const vector<int>& array) {
    for (int num : array)
        cout << num << endl;
}

// 传引用,这样排序操作直接作用在原vector上
void quickSort(vector<int>& array, int low, int high) {
    int i = low;
    int j = high;
    int pivot = array[(i + j) / 2];
    int temp;
    while (i <= j) {
        while (array[i] < pivot)
            i++;
        while (array[j] > pivot)
            j--;
        if (i <= j) {
            temp = array[i];
            array[i] = array[j];
            array[j] = temp;
            i++;
            j--;
        }
    }
    if (j > low)
        quickSort(array, low, j);
    if (i < high)
        quickSort(array, i, high);
}

int main() {
    vector<int> array = {95, 45, 48, 98, 1, 485, 65, 478, 1, 2325};
    // 用vector的size()获取元素个数,转成int适配函数参数
    int n = array.size();
    cout << "Before Quick Sort :" << endl;
    printArray(array);
    // high参数传n-1,对应最后一个元素的索引
    quickSort(array, 0, n - 1);
    cout << "After Quick Sort :" << endl;
    printArray(array);
    return 0;
}
额外优化小建议
  • 用范围for循环替代传统索引循环,代码更简洁易读(比如printArray里的写法)
  • 尽量避免using namespace std;,在大型项目里容易引发命名冲突,小demo里倒无所谓
  • pivot的选择可以优化成三数取中法,避免极端情况下的最坏时间复杂度

内容的提问来源于stack exchange,提问作者Tsz Yee Ha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:32:54