命名空间
变体
操作

std::qsort

来自 cppreference.cn
< cpp‎ | 算法
 
 
算法库
有约束算法与针对范围的算法 (C++20)
有约束的算法,例如 ranges::copyranges::sort 等……
执行策略 (C++17)
排序及相关操作
划分操作
排序操作
二分搜索操作
(于已划分范围上)
集合操作(于已排序范围上)
归并操作(于已排序范围上)
堆操作
最小/最大值操作
(C++11)
(C++17)
字典序比较操作
排列操作
C 库
qsort
数值操作
未初始化内存上的操作
 
定义于头文件 <cstdlib>
void qsort( void *ptr, std::size_t count,

            std::size_t size, /* c-compare-pred */* comp );
void qsort( void *ptr, std::size_t count,

            std::size_t size, /* compare-pred */* comp );
(1)
extern "C" using /* c-compare-pred */ = int(const void*, const void*);
extern "C++" using /* compare-pred */ = int(const void*, const void*);
(2) (仅作说明*)

以升序排序 ptr 指向的给定数组。该数组包含 count 个元素,每个元素占用 size 字节。comp 指向的函数用于对象比较。

如果 comp 指示两个元素相等,则它们的顺序未指定。

如果数组元素的类型不是 PODType(C++11 前)可平凡复制类型(C++11 起),则行为未定义。

目录

[编辑] 参数

ptr - 指向要排序的数组的指针
count - 数组中的元素数量
size - 数组中每个元素的字节大小
comp - 比较函数,如果第一个参数“小于”第二个参数,则返回负整数值;如果第一个参数“大于”第二个参数,则返回正整数值;如果参数相等,则返回零。

比较函数的签名应等效于以下内容

 int cmp(const void *a, const void *b);

该函数不得修改传递给它的对象,并且在对相同对象进行调用时必须返回一致的结果,无论它们在数组中的位置如何。

[编辑] 返回值

(无)

[编辑] 注意

尽管有这个名称,C++、C 和 POSIX 标准不要求此函数使用 快速排序 实现,也不作任何复杂性或稳定性保证。

C++ 标准库提供的两个重载是不同的,因为参数 comp 的类型不同(语言链接是其类型的一部分)。

[编辑] 示例

以下代码使用 qsort() 对整数数组进行排序

#include <array>
#include <climits>
#include <compare>
#include <cstdlib>
#include <iostream>
 
int main()
{
    std::array a{-2, 99, 0, -743, INT_MAX, 2, INT_MIN, 4};
 
    std::qsort
    (
        a.data(),
        a.size(),
        sizeof(decltype(a)::value_type),
        [](const void* x, const void* y)
        {
            const int arg1 = *static_cast<const int*>(x);
            const int arg2 = *static_cast<const int*>(y);
            const auto cmp = arg1 <=> arg2;
            if (cmp < 0)
                return -1;
            if (cmp > 0)
                return 1;
            return 0;
        }
    );
 
    for (int ai : a)
        std::cout << ai << ' ';
    std::cout << '\n';
}

输出

-2147483648 -743 -2 0 2 4 99 2147483647

[编辑] 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 发布时的行为 正确的行为
LWG 405 C++98 数组元素可以有任何类型 限于 PODType

[编辑] 参阅

在数组中搜索未指定类型的元素
(函数) [编辑]
将一个范围按升序排序
(函数模板) [编辑]
(C++11)(C++26 中已弃用)
检查类型是否为平凡类型
(类模板) [编辑]
C 文档 关于 qsort