c - 通用快速排序不起作用

标签 c pointers quicksort

我正在尝试创建一个通用的快速排序函数,但我无法理解我正在做的事情出了什么问题,因为它无法正常工作。
这是我的代码:

typedef bool (*CmpFunction)(void*, void*);

void swap(void *c1, void *c2)
{
    assert(c1 && c2);
  int c = *(int*)c1;
  *(int*)c1 = *(int*)c2;
  *(int*)c2 = c;
}

void quick_sort(void* a, int n, CmpFunction swap)
{
   int p, b = 1, t = n - 1;
   if (n < 2)
      return;
   swap((char*)a, (char*)a+n/2);
   p = *(int*)a;
   while(b <= t) {
      while(t >= b && (char*)a + t >= p )
         t--;
      while(b <= t && (char*)a + b < p)
         b++;
      if ( b < t)
         swap((char*)a+(b++), (char*)a+(t--));
   }
   swap((char*)a, (char*)a+t);
   quick_sort(a, t, swap);
   n=n-t-1;
   quick_sort(a + t + 1, n, swap);
}

虽然原始的快速排序函数(无需我尝试使其通用)是:

void quick_sort(int a[], int n)
{
   int p, b = 1, t = n - 1;
   if (n < 2)
      return;
   swap(&a[0], &a[n/2]);
   p = a[0];
   while(b <= t) {
      while(t >= b && a[t] >= p )
         t--;
      while(b <= t && a[b] < p)
         b++; 
      if ( b < t) 
         swap(&a[b++], &a[t--]);
   }
   swap(&a[0], &a[t]);
   quick_sort(a, t);
   n=n-t-1;
   quick_sort(a + t + 1, n);
}

void swap(int *c1, int *c2)
    {
      int c = *c1;
      *c1 = *c2;
      *c2 = c;
    }

我正在使用这个 main():

int main(){

    char b[] = {'a','t','b','c','y','s'};
    int c[] = {1,4,6,3,5,7};
    quick_sort(c, 6, &swap);

    for (int i=0;i<6;i++)
        printf("%d | ", c[i]);

    return 0;
}

现在我们都同意输出应该是:

1, 3, 4, 5, 6, 7

这确实是我在运行非通用函数时得到的结果。
当我运行通用(上部)函数时,我基本上得到的是垃圾。

大家有什么想法我错了吗? :)

最佳答案

最明显的问题:您的输入数据是一个 int 数组,类型转换为 void * 指针,然后强制转换为 char * 指针:

swap((char*)a, (char*)a+n/2);

在这里,您将其强制转换为 char * 指针,并跳转 n/2 到其中。
char * 是 1 字节大小元素的数组
int * 是 2、4 或 8 字节大小元素的数组,具体取决于编译器/操作系统/CPU。

因此 char *a +1, void 给出初始数组第一个元素的第二个字节。

关于c - 通用快速排序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36829667/

相关文章:

c++ - 将 C 编译的静态库链接到 C++ 程序

c++ - 我正在尝试计算 char 数组中的内容直到空终止,但每次编译时我得到的数字都大于我的数组

C++ reinterpret_cast 一个整数

c - C语言中的指针和赋值函数

java - 快速排序。线程中出现异常 "main"java.lang.StackOverflowError

c - C程序打印错误

c - 如何解决有关将函数指针传递给 C 中的宏的警告?

html - 脚本输出结束 - CGI/HTML

java - 快速排序的错误实现

运行快速排序时 JavaScript 崩溃