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

Posted

技术标签:

【中文标题】C中字符数组的快速排序数组【英文标题】:Quick sorting array of arrays of chars in C 【发布时间】:2022-01-21 15:49:23 【问题描述】:

我一直在尝试在 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 &lt;= right &amp;&amp; strcmp(a[i], pivot) &lt; 0);

【问题讨论】:

最近有人问,使用strcpy() 复制一个字符串。 arr[0] = "patata"; 等会覆盖您分配的指针。 您还必须提供声明以满足对函数partition() 的前向引用或移动该函数。不要忽略编译器警告。 我尝试过使用 strcpy,但它不起作用。我也解决了警告,但结果相同。 您正在分配内存并在分配静态字符串时立即泄漏它;不需要mallocchar *arr[] = "patata", "berenjena", "alioli" ;,你当然也不需要strcpy 这只是一个例子。在我的真实程序中,我有问题中描述的结构。 【参考方案1】:

请注意,您检查 i 仅在 strcmp(a[i], pivot) &lt; 0 之后才超过 a 的长度,因此您到达 i=3 然后被转储。

改成

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

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

【讨论】:

你是对的,但这并不能解决问题:( @AntonioGamizDelgado 我刚刚在我的电脑上运行了代码,没有任何错误 使用calloc?还是 malloc? 我正在使用 gcc -p t test.c && ./t 进行编译 @AntonioGamizDelgado 两者,用gcc -Wall tmp.c -o tmp编译

以上是关于C中字符数组的快速排序数组的主要内容,如果未能解决你的问题,请参考以下文章

C语言,快速排序算法

如何使用快速排序对字符串数组进行排序

如何使用基数排序对变长字符串数组进行排序?

二维数组快速排序(sort+qsort)

excel快速排序技巧,如何使用SORTBY函数对数据进行排序

排序算法----快速排序(数组形式)