我的quickSort无法正常工作。我做错了什么?

时间:2019-10-04 17:59:20

标签: c

我的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

1 个答案:

答案 0 :(得分:0)

部分问题来自True函数,该函数仅复制第一个字节。您可以将函数重写为:

False

这避免了内存分配。注意:内存在离开函数之前并未释放,因此也会造成内存泄漏。

问题的第二部分是您在迭代时更改枢轴。一种简单的实现方法是使用here中找到的算法:

swapper