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

C++ sort函数工作原理及arr、arr+n参数含义详解

问题相关代码示例
#include <bits/stdc++.h>
using namespace std;
 
int main()
{
    int arr[] = { 1, 5, 8, 9, 6, 7, 3, 4, 2, 0 };
    int n = sizeof(arr) / sizeof(arr[0]);

    sort(arr, arr + n);
 
    cout << "\nArray after sorting using "
            "default sort is : \n";
    for (int i = 0; i < n; ++i)
        cout << arr[i] << " ";
 
    return 0;
}

1. sort函数的工作机制

这里调用的是C++标准库的std::sort,当前主流STL实现中它采用内省排序(Introsort) 作为核心算法,是多种排序算法的组合优化方案:

  • 默认采用快速排序的分区逻辑处理大数据段,平均时间复杂度为O(nlogn)
  • 当递归深度超过log2(待排序元素个数)时,自动切换为堆排序,避免快速排序最坏情况退化为O(n²)的问题
  • 当待排序的子段长度小于阈值(通常为16或32)时,切换为插入排序,小数据场景下插入排序的常数开销远低于其他O(nlogn)级别的排序算法
    默认使用<运算符做大小比较,因此上述代码输出的是升序排序后的数组。

2. 第一个参数直接传数组名arr而非数组下标的原因

std::sort要求第一个入参是指向待排序范围起始位置的向前迭代器:
C++中数组名在绝大多数语境下会隐式退化为指向数组首元素的指针,此处arr直接等价于&arr[0],刚好指向待排序数组的第一个元素,完全符合起始迭代器的要求,不需要额外取下标再取地址。

3. 第二个参数arr + n的作用与含义

std::sort的第二个入参是尾后迭代器,遵循标准库的左闭右开区间设计:
待排序的范围是[起始迭代器, 尾后迭代器),即包含起始迭代器指向的元素,不包含尾后迭代器指向的元素。这里n是数组的总元素个数,arr + n是刚好越过数组最后一个有效元素arr[n-1]的内存地址,作为尾后迭代器传入后,整个数组的所有元素都会被纳入排序范围。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:45:03