稳定标准库 qsort?

2024-04-24

我假设 stdlib 中的旧 qsort 函数不稳定,因为手册页没有提及任何相关内容。这就是我正在谈论的功能:

   #include <stdlib.h>
   void qsort(void *base, size_t nmemb, size_t size,
              int(*compar)(const void *, const void *));  

我假设如果我更改比较函数以也包括我正在比较的地址,它将是稳定的。那是对的吗?

Eg:

int compareFoos( const void* pA, const void *pB ) {
    Foo *pFooA = (Foo*) pA;
    Foo *pFooB = (Foo*) pB;

    if( pFooA->id < pFooB->id ) {
        return -1;
    } else if( pFooA->id > pFooB->id ) {
        return 1;
    } else if( pA < pB ) {
        return -1;            
    } else if( pB > pA ) {
       return 1;
    } else {
       return 0;
    }
}   

不,不幸的是你不能依赖这一点。假设您有数组(每个记录中的两个字段用于检查,但只有第一个字段用于排序):

B,1
B,2
A,3

不稳定排序可能会比较B,1 with A,3并交换它们,给出:

A,3
B,2
B,1

如果下一步要比较B,2 with B,1,密钥将是相同的,因为B,2地址小于B,1,不会发生交换。对于稳定的排序,您应该最终得到:

A,3
B,1
B,2

唯一的方法是附加starting指针的地址(不是它的current地址)并使用它以及其他键进行排序。这样,原始地址就成为排序键的较小部分,以便B,1最终会在之前结束B,2无论两人在哪里B排序过程中会出现线路。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

稳定标准库 qsort? 的相关文章

随机推荐