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

如何正确统计快速排序(quicksort)算法执行过程中的比较次数?

快速排序比较次数统计偏低问题解决

核心问题定位

你代码里的count++放置逻辑存在缩进语法错误:Java中没有用花括号包裹的循环/分支结构,仅会将紧接的第一行代码识别为循环体,你写的两个比较搜索循环的count++都不属于循环内部,无论单次循环做了多少次元素比较,最终只会各累加1次,自然统计结果远低于实际值。

你当前的写法等价于以下逻辑:

// 搜索大于基准值的元素
while (left < right && data[left] <= partitionelement) {
    left++;
}
count++; // 仅在循环退出时计数1次,而非每次比较都计数

// 搜索小于基准值的元素
while (data[right] > partitionelement) {
    right--;
}
count++; // 同上仅计数1次

修复方案

给两个搜索循环加上花括号,将count++移动到循环内部,每次元素比较时就累加计数。如果只统计待排序元素之间的比较次数(索引大小比较不计入),修改后的循环代码如下:

while (left < right) {
    // 搜索大于基准值的元素
    while (left < right) {
        count++; // 每次元素比较计数+1
        if (data[left] <= partitionelement) {
            left++;
        } else {
            break;
        }
    }
    // 搜索小于等于基准值的元素
    while (true) {
        count++; // 每次元素比较计数+1
        if (data[right] > partitionelement) {
            right--;
        } else {
            break;
        }
    }
    // 交换元素
    if (left < right) 
        swap(data, left, right);
}

效果验证

快速排序的平均比较次数约为1.39nlog₂n,80个元素的平均比较次数约为700次左右,受基准值选择、数组有序性影响会在1000上下浮动,修改计数逻辑后统计结果就会匹配预期。

内容的提问来源于stack exchange,提问作者mFuchs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 05:06:04