名稱空間
變體
操作

std::qsort

來自 cppreference.com
< 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