使用快速排序来排序字符数组

时间:2013-11-17 12:16:23

标签: c arrays pointers quicksort

我想对一组字符进行排序。但是,每次运行程序时,它都会在达到QuickSort功能时崩溃。导致这种影响的可能是什么错误?我正在使用指针数组来排序数组。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void print(char** A, int n){
    int i = 0;
    for (i = 0; i < n; i++){
        printf("%s\n", A[i]);
    }
}

int Partition(char** A, int p, int r){
    char *temp = (char*)malloc(sizeof(char)*30);
    char *x = (char*)malloc(sizeof(char)*30);
    x = A[r];
    int i = p - 1;
    int j = 0;
    for(j = p; j<=r; j++){
        if(strcmp(A[j],x) <=0){
            i=i+1;
            temp = A[i];
            A[i] = A[j];
            A[j] = temp;
            }
        }
    if(i<r){
         return i;
    }else{
        return i-1;
    }

    free(temp);
    free(x);

}

void QuickSort(char** A, int p, int r){
    if(p<r){
        int q = Partition(A, p, r);
        QuickSort(A, p, q);
        QuickSort(A, q+1, r);
    }
}


int main(){
    int i = 0;

    char **A = (char**) malloc(12*sizeof(char*));

    for(i = 0; i < 12; i++){
        A[i] = (char*) malloc(sizeof(char)*30);
    }

    strcpy(A[0], "imarr");
    strcpy(A[1], "ikak");
    strcpy(A[2], "agh");
    strcpy(A[3], "ogss");
    strcpy(A[4], "alllll");
    strcpy(A[5], "ackm");
    strcpy(A[6], "plccc");
    strcpy(A[7], "strrr");
    strcpy(A[8], "raat");
    strcpy(A[9], "omhhh");
    strcpy(A[10], "rrors");
    strcpy(A[11], "basds");

    QuickSort(A, 0, 12);

    print(A, 12);

    free(A);

    return 0;
}

2 个答案:

答案 0 :(得分:1)

替换

QuickSort(A, 0, 12);

QuickSort(A, 0, 11);

编译并运行它,然后考虑一下。我想你应该足够聪明,弄清楚为什么12是不正确的,而11是可以的。

顺便说一下,我认为这个问题真的应该转到https://codereview.stackexchange.com/

已编辑:抱歉,我最初没有注意到这个问题:

Partition这三条线很奇怪:

char *x = (char*)malloc(sizeof(char)*30);
x = A[r];
......
free(x);

没有问题(意味着没有崩溃,而实际上是内存泄漏,因为分配的x没有被释放,并且A被错误地释放)在这种情况下,因为数组A也分配了malloc 此外,当您在交换时使用temp作为保持值char*的变量时,不需要分配内存。请参阅已编辑的代码:

int Partition(char** A, int p, int r){
    char *temp;
    char *x = A[r];
    int i = p - 1;
    int j = 0;
    for(j = p; j<=r; j++){
        if(strcmp(A[j],x) <=0){
            i=i+1;
            temp = A[i];
            A[i] = A[j];
            A[j] = temp;
            }
        }
    if(i<r){
         return i;
    }else{
        return i-1;
    }
}

答案 1 :(得分:0)

http://algs4.cs.princeton.edu/23quicksort/

void quick_sort (int *a, int n) {
    if (n < 2)
        return;
    int p = a[n / 2];
    int *l = a;
    int *r = a + n - 1;
    while (l <= r) {
        if (*l < p) {
            l++;
        }
        else if (*r > p) {
            r--;
        }
        else {
            int t = *l;
            *l = *r;
            *r = t;
            l++;
            r--;
        }
    }
    quick_sort(a, r - a + 1);
    quick_sort(l, a + n - l);
}

int main () {
    int a[] = {4, 65, 2, -31, 0, 99, 2, 83, 782, 1};
    int n = sizeof a / sizeof a[0];
    quick_sort(a, n);
    return 0;
}