我的QuickSort没有排序。我不明白为什么。当我进行两次排序时,它可以正确排序,但是如果我们两次使用quicksort,则不是quicksort。
我的任务是编写一个通用的快速排序函数,以便对任何类型的数组进行排序。在该函数中,我们获得了一个用于排序的字符串的指针,字符串的长度,一个元素的大小以及比较函数。
我的比较功能:
int icmp(void* x, void* y)
{
int a = *(int*)x;
int b = *(int*)y;
if (a > b) {
return 1;
}
else if (a < b) {
return -1;
}
else {
return 0;
}
}
我的交换函数:
void swapper(void* x, void* y, size_t size)
{
char* a = NULL;
if ((a = (char*)malloc(size * sizeof(char*))) == NULL) {
return NULL;
}
for (int i = 0; i < size; i++) {
a[i] = *((char*)x + i * sizeof(char*));
}
*(char*)x = *(char*)y;
*(char*)y = *a;
}
我的排序功能:
void my_qsort(const void* ptr, size_t count, size_t size, int (*cmp)(const void*, const void*))
{
sort(ptr, 0, count - 1, size, cmp);
}
void sort(const void* ptr, int low, int high, size_t size, int (*cmp)(const void*, const void*))
{
int i = low;
int j = high;
char* mid = (char*)ptr + ((i + j) / 2) * size;
while (i <= j)
{
while ((cmp((char*)ptr + i * size, mid) == -1)) {
i++;
}
while (cmp((char*)ptr + j * size, mid) == 1) {
j--;
}
if (i <= j) {
swapper((char*)ptr + i * size, (char*)ptr + j * size, size);
i++;
j--;
}
}
if (j > low) {
sort(ptr, low, j, size, cmp);
}
if (i < high) {
sort(ptr, i, high, size, cmp);
}
}
1)输入点:83 21 52 10 49 22 21 34 51 51
输出ptr:10 21 21 22 34 49 51 52 51 83
2)输入点:59 4 47 79 9 44 5 78 40 19
输出ptr:4 5 9 19 40 44 47 59 78 79
3)输入点:13 80 97 73 14 17 32 26 92 90
输出ptr:13 14 73 17 26 32 80 90 92 97
答案 0 :(得分:0)
部分问题来自True
函数,该函数仅复制第一个字节。您可以将函数重写为:
False
这避免了内存分配。注意:内存在离开函数之前并未释放,因此也会造成内存泄漏。
问题的第二部分是您在迭代时更改枢轴。一种简单的实现方法是使用here中找到的算法:
swapper