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