快速排序代码复用的方法(未实践)

本文深入分析了qsort库函数,并结合快速排序的递归实现,通过改变参数类型和引入回调函数,优化了代码通用性和效率。最终,作者选择直接调用qsort.c源码作为库函数,以实现高效排序。文章详细阐述了从理论到实践的改进过程,适合对算法优化感兴趣的开发者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

深入剖析qsort()库函数:    http://blog.pfan.cn/accelerator/14298.html    

结合《数据结构与算法分析——C语言描述》中给出用递归实现的快速排序,
和VC++中的qsort.c源码分析,对比学习。

尝试对《数据结构与算法分析——C语言描述》的快速排序代码做以下改进:

1: 改变Qsort(ElementType A[], int Left, int Right)中的形参ElementType A[ ]为qsort.c源码中的void *指针,达到代码的最大通用性。虽然通过定义 typedef ElementType 也有代码复用的功能,但在通用性上不如void *完美,因为只能定义一组类型的快速排序。若程序中需要对不同类型进行排序,则ElementType 有心无力。

同时把Swap()函数换成qsort.c源码中的形式,同样也是出于代码通用和扩展考虑。
回调函数::如果 qsort()函数中形参没有回调函数cmp,而仅仅是在函数内部进行比较,则不能调用不同类型的比较含数据,也就是说,如果 qsort()函数嵌套一个cmp()函数,那么必定是一个具体类型的函数,也就达不到通用类型的作用。


后来:由于修改的东西实在太多,而且怕递归的效率不够好(尤其在嵌入式系统中),因此直接将VC++中的qsort.c源码作为自己的库调用,以达到使用目的。





疑惑:qsort.c源码中,
void __cdecl qsort (
    void *base,
    unsigned num,
    unsigned width,
    int (__cdecl *comp)(const void *, const void *)
    )
{
    char *lo, *hi;              /* ends of sub-array currently sorting */
    char *mid;                  /* points to middle of subarray */
    char *loguy, *higuy;        /* traveling pointers for partition step */
    unsigned size;              /* size of the sub-array */
    char *lostk[30], *histk[30];
    int stkptr;                 /* stack for saving sub-array to be processed */

//    int *pp;

    /* Note: the number of stack entries required is no more than
       1 + log2(size), so 30 is sufficient for any array */

    if (num < 2 || width == 0)
        return;                 /* nothing to do */

    stkptr = 0;                 /* initialize stack */

//pp = lo;                //提示出错,赋值类型不兼容
    lo = base;        // 疑惑,为什么base指针作为void *指针可以直接对char *类型的lo指针赋值而没有警告????
    hi = (char *)base + width * (num-1);        /* initialize limits */

    /* this entry point is for pseudo-recursion calling: setting
       lo and hi and jumping to here is like recursion, but stkptr is
       prserved, locals aren't, so we preserve stuff on the stack */
recurse:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值