C中字符数组的快速排序数组

Quick sorting array of arrays of chars in C

我一直在尝试在 C 中实现一种快速排序的字符数组,但它给了我一个我无法调试的分段错误。这是代码:

int partition(char **a, int left, int right)
{
    int i, j;
    char pivot[16];
    strcpy(pivot, a[left]);
    i = left;
    j = right + 1;

    while (1)
    {
        do
            i++;
        while (i <= right && strcmp(a[i], pivot) < 0);
        do
            j--;
        while (strcmp(a[j], pivot) > 0);
        if (i >= j)
            break;
        char t[16];
        strcpy(t, a[i]);
        strcpy(a[i], a[j]);
        strcpy(a[j], t);
    }
    char t[16];
    strcpy(t, a[left]);
    strcpy(a[left], a[j]);
    strcpy(a[j], t);
    return j;
}

void quickSortChar(char **a, int left, int right)
{
    int j;
    if (left < right)
    {
        j = partition(a, left, right);
        quickSortChar(a, left, j - 1);
        quickSortChar(a, j + 1, right);
    }
}

int main()
{
    char **arr = (char **)calloc(10, sizeof(char *));
    arr[0] = (char *)malloc(16);
    arr[1] = (char *)malloc(16);
    arr[2] = (char *)malloc(16);
    arr[0] = "patata";
    arr[1] = "berenjena";
    arr[2] = "alioli";

    quickSortChar(arr, 0, 2);
}

更新 1

使用strcpy也不行:

int partition(char **a, int left, int right)
{
    int i, j;
    char pivot[16];
    strcpy(pivot, a[left]);
    i = left;
    j = right + 1;

    while (1)
    {
        do
            i++;
        while (strcmp(a[i], pivot) < 0 && i <= right);
        do
            j--;
        while (strcmp(a[j], pivot) > 0);
        if (i >= j)
            break;
        char t[16];
        strcpy(t, a[i]);
        strcpy(a[i], a[j]);
        strcpy(a[j], t);
    }
    char t[16];
    strcpy(t, a[left]);
    strcpy(a[left], a[j]);
    strcpy(a[j], t);
    return j;
}

更新 2

我通过上移声明解决了警告。

更新 3

修复while (i <= right && strcmp(a[i], pivot) < 0);

请注意,您检查 i 仅在 strcmp(a[i], pivot) < 0 之后没有超过 a 的长度,因此您达到 i=3 然后被丢弃。

改为

while (i <= right && strcmp(a[i], pivot) < 0);

我还建议使用 calloc 而不是 malloc 来初始化 arr