【问题标题】:Quicksort implementation in cc中的快速排序实现
【发布时间】:2014-08-25 11:18:59
【问题描述】:

我有一个快速排序程序,如图所示执行。但是最后一个元素没有被排序。谁能告诉我如何修改程序以获得正确的结果。

#include <stdlib.h>
#include <stdio.h>

static void swap(void *x, void *y, size_t l)
{
    char *a = x, *b = y, c;
    while(l--)
    {
        c = *a;
        *a++ = *b;
        *b++ = c;
    }
}

static void sort(char *array, size_t size, int (*cmp)(void*,void*), int begin, int end)
{
    if (end > begin)
    {
        void *pivot = array + begin;
        int l = begin + size;
        int r = end;
        while(l < r)
        {
            if (cmp(array+l,pivot) <= 0)
            {
                l += size;
            }
            else if ( cmp(array+r, pivot) > 0 )
            {
                r -= size;
            }
            else if ( l < r )
            {
                swap(array+l, array+r, size);
            }
        }
        l -= size;
        swap(array+begin, array+l, size);
        sort(array, size, cmp, begin, l);
        sort(array, size, cmp, r, end);
    }
}

void qsort(void *array, size_t nitems, size_t size, int (*cmp)(void*,void*))
{
    sort(array, size, cmp, 0, (nitems-1)*size);
}

typedef int type;

int type_cmp(void *a, void *b){ return (*(type*)a)-(*(type*)b); }

int main(void)
{ /* simple test case for type=int */
    int num_list[]={5,4,3,2,1};
    int len=sizeof(num_list)/sizeof(type);
    char *sep="";
    int i;
    qsort(num_list,len,sizeof(type),type_cmp);
    printf("sorted_num_list={");
    for(i=0; i<len; i++){
        printf("%s%d",sep,num_list[i]);
        sep=", ";
    }
    printf("};\n");
    return 0;
}

结果:

sorted_num_list={2, 3, 4, 5, 1};

为什么?

我试着做(nitems)*size。但是当我对字符串尝试同样的方法时,它给了我错误

【问题讨论】:

  • 我会在代码审查中发布这个。
  • 你的代码没有被编译。
  • 修改它我构建一个包含所有符号并关闭优化的调试版本。然后在调试器下运行。

标签: c quicksort


【解决方案1】:

问题出在这一行:

sort(array, size, cmp, 0, (nitems-1)*size);

nitems 是您的项目数,这里是 5,您要减去一个,因此您的快速排序只会对前 4 个元素进行排序。去掉 -1 就可以了。

sort(array, size, cmp, 0, nitems*size);

【讨论】:

    【解决方案2】:

    这里有两个错误...

    首先将qsort() 函数名称更改为qsort_user() 或任何其他名称,然后是qsort(),因为qsort()stdlib.h 中定义的标准函数


    那就改这一行

      sort(array, size, cmp, 0, (nitems-1)*size);
    

      sort(array, size, cmp, 0, (nitems)*size);
    

    【讨论】:

      猜你喜欢
      • 2011-03-29
      • 2017-02-18
      • 2019-11-20
      • 2017-05-09
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多