Quicksort不适用于最后两个数字

时间:2013-12-08 18:58:14

标签: c algorithm sorting quicksort

任务是为数组中的未知类型元素编写快速排序(仅使用C代码),但我的代码不适用于最后两个元素。以下数字输出是 '67 45 44 33 5 1 -3 0 -4 -100' 我也尝试调试,但我唯一理解的是最后的数字只是不比较。

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <memory.h>
typedef int typeEl;

void swap(void* a, void* b, size_t sizeOfElem) {
    void* tmp = calloc(1,sizeOfElem);
    memcpy(tmp, a, sizeOfElem);
    memcpy(a, b, sizeOfElem);
    memcpy(b, tmp, sizeOfElem);
}

int compare(const void* a, const void* b)
{

    return (*(typeEl*)a - *(typeEl*)b);
}

void quickSortR(void* a, long N, size_t sizeOfElem, int (*comp)(const void* c, const void* d)) 
{

  long i = 0, j = N;        


  void* p = (void *) ((char *)a + (N>>1)*sizeOfElem);       

  do {
    while ( comp((void *) ((char *)a + i*sizeOfElem), p)>0) i++;
    while ( comp((void *) ((char *)a + j*sizeOfElem), p)<0) j--;

    if (i <= j) {
      swap((void *) ((char *)a + i*sizeOfElem), (void *) ((char *)a + j*sizeOfElem), sizeOfElem);
      i++; j--;
    }
  } while ( i<=j );


  if ( j > 0 ) quickSortR((void *)a, j, sizeOfElem, comp);
  if ( N > i ) quickSortR((void *) ((char *)a + i*sizeOfElem), N-i,sizeOfElem, comp);
}
int main() {
    int n;
   int m[10] = {1,-3,5,-100,45,33,44,67,-4, 0};

   quickSortR((void *)m, 10, sizeof(int),compare);              
    for (n=0; n<10; n++)
        printf ("%d ",m[n]);
   return 0;
}

任何人都可以提供建议吗? 谢谢你的帮助!

1 个答案:

答案 0 :(得分:4)

您的代码中存在3个问题:

  1. j = N的初始化应为j = N - 1。原因:稍后您使用位置j处的元素开始比较,C中数组的索引为[0,N-1]

  2. 枢轴p不是指针而是值。当交换位置p处的值但您仍将其视为枢轴时,这会影响结果。你的代码似乎是为了与指针进行比较而设计的,但我可以提供一个快速的&amp;丑陋(也很危险!)修复:
    替换你的代码:

    void* p = (void *) ((char *)a + (N>>1)*sizeOfElem);
    

    用这些:

    void* p = (void *) ((char *)a + (N>>1)*sizeOfElem);
    void *px = malloc(sizeOfElem);
    memcpy(px, p, sizeOfElem);
    p = px;
    
  3. 您的代码行:

    if ( j > 0) quickSortR((void *)a, j, sizeOfElem, comp);
    

    应为:

    if ( j > 0) quickSortR((void *)a, j + 1, sizeOfElem, comp);
    

    因为在quickSortR的第二个参数,你传递了数组的长度。

  4. 解决所有这三个问题,您的代码应该给出正确的结果。

    <强>编辑:
    当我说上面3 problems时,我指的是实现算法时的问题。除此之外,您的函数compare中存在内存泄漏(只需free(tmp)即可解决)。此外,测试if ( N > i )可以是if ( N > i + 1 ) :)