名稱空間
變體
操作

qsort, qsort_s

來自 cppreference.com
< c‎ | 演算法
在標頭檔案 <stdlib.h> 中定義
void qsort( void* ptr, size_t count, size_t size,
            int (*comp)(const void*, const void*) );
(1)
errno_t qsort_s( void* ptr, rsize_t count, rsize_t size,

                 int (*comp)(const void*, const void*, void*),

                 void* context );
(2) (C11 起)
1)ptr 所指向的給定陣列進行升序排序。該陣列包含 count 個大小為 size 位元組的元素。函式指標 comp 用於物件比較。
2)(1) 相同,除了額外的上下文引數 context 被傳遞給 comp,並且在執行時檢測到以下錯誤並呼叫當前安裝的 約束處理程式 函式
  • countsize 大於 RSIZE_MAX
  • ptrcomp 是空指標(除非 count 為零)
與所有邊界檢查函式一樣,qsort_s 僅在實現定義了 __STDC_LIB_EXT1__ 且使用者在包含 <stdlib.h> 之前將 __STDC_WANT_LIB_EXT1__ 定義為整數常量 1 時才保證可用。

如果 comp 指示兩個元素相等,則它們在結果排序陣列中的順序是未指定的。

目錄

[編輯] 引數

ptr - 指向要排序的陣列的指標
count - 陣列中的元素數量
size - 陣列中每個元素的位元組大小
comp - 比較函式,如果第一個引數小於第二個引數,則返回負整數值;如果第一個引數大於第二個引數,則返回正整數值;如果引數相等,則返回零。

比較函式的簽名應等效於以下內容

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

該函式不得修改傳遞給它的物件,並且在對相同物件進行呼叫時必須返回一致的結果,無論它們在陣列中的位置如何。

context - 附加資訊(例如,排序序列),作為第三個引數傳遞給 comp

[編輯] 返回值

1) (無)
2) 成功時返回零,如果檢測到執行時約束衝突則返回非零

[編輯] 注意

儘管有名稱,C 和 POSIX 標準都不要求此函式使用 快速排序 實現,也不提供任何複雜性或穩定性保證。

與其他邊界檢查函式不同,qsort_s 不將大小為零的陣列視為執行時約束衝突,而是成功返回而不更改陣列(唯一接受大小為零的陣列的另一個函式是 bsearch_s)。

Windows CRTqsort_s 的實現與 C 標準不相容。Microsoft 的版本宣告為:void qsort_s(void *base, size_t num, size_t width,
             int (*compare )(void *, const void *, const void *), void * context);
。它不返回值,並且比較函式的引數順序與標準相反:context 首先傳遞。

[編輯] 示例

#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
 
int compare_ints(const void* a, const void* b)
{
    int arg1 = *(const int*)a;
    int arg2 = *(const int*)b;
 
    if (arg1 < arg2) return -1;
    if (arg1 > arg2) return 1;
    return 0;
 
    // return (arg1 > arg2) - (arg1 < arg2); // possible shortcut
 
    // return arg1 - arg2; // erroneous shortcut: undefined behavior in case of
                           // integer overflow, such as with INT_MIN here
}
 
int main(void)
{
    int ints[] = {-2, 99, 0, -743, 2, INT_MIN, 4};
    int size = sizeof ints / sizeof *ints;
 
    qsort(ints, size, sizeof(int), compare_ints);
 
    for (int i = 0; i < size; i++)
        printf("%d ", ints[i]);
 
    printf("\n");
}

輸出

-2147483648 -743 -2 0 2 4 99

[編輯] 參考

  • C23 標準 (ISO/IEC 9899:2024)
  • 7.22.5.2 qsort 函式 (p: TBD)
  • K.3.6.3.2 qsort_s 函式 (p: TBD)
  • C17 標準 (ISO/IEC 9899:2018)
  • 7.22.5.2 qsort 函式 (p: 258-259)
  • K.3.6.3.2 qsort_s 函式 (p: 442-443)
  • C11 標準 (ISO/IEC 9899:2011)
  • 7.22.5.2 qsort 函式 (p: 355-356)
  • K.3.6.3.2 qsort_s 函式 (p: 609)
  • C99 標準 (ISO/IEC 9899:1999)
  • 7.20.5.2 qsort 函式 (p: 319)
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • 4.10.5.2 qsort 函式

[編輯] 另請參閱

在陣列中搜索未指定型別的元素
(函式) [編輯]
C++ 文件 關於 qsort