需要帮助查找C中快速排序实现中的错误原因吗

需要帮助查找C中快速排序实现中的错误原因吗,c,C,我在Xcode-thread1中遇到了一些奇怪的错误:下面代码段中的EXC_BAD_访问错误 while(*w1 != '\0' && *w2 != '\0') 下面是快速排序的实现和比较方法: void quicksort(char ***words, int start, int end){ //start is pivot if(start >= end){ return; } int left = start; in

我在Xcode-thread1中遇到了一些奇怪的错误:下面代码段中的EXC_BAD_访问错误

while(*w1 != '\0' && *w2 != '\0')
下面是快速排序的实现和比较方法:

void quicksort(char ***words, int start, int end){ //start is pivot
    if(start >= end){
        return;
    }
    int left = start;
    int right = end;

    int comp;
    while( left <= right ){
        do{
            char* w1 = (*words)[++left];
            char* w2 = (*words)[start];
            comp = compare(w1, w2);
        }while(comp < start); //while current left less than pivot

        do{
            char* w1= (*words)[--right];
            char* w2= (*words)[start];
            comp = compare(w1, w2);
        }while(comp >= start); //while current right is more or equal to pivot

        if(left < right){
            swap(words, left, right);
        }
    }
    swap(words, start, --left);
    quicksort(words, 0, left-1);
    quicksort(words, left+1, end);
}

int compare(char *w1, char *w2){
    while(*w1 != '\0' && *w2 != '\0'){
        if( *w1 < *w2 ){
            return -1;
        }else if( *w1 > *w2 ){
            return 1;
        }else{
            w1++;
            w2++;
        }
    }

    if(*w1 == *w2)
        return 0;
    else if(*w1 == '\0')
        return -1;
    else return 1;
}
void快速排序(char***words,int start,int end){//start是pivot
如果(开始>=结束){
返回;
}
int左=开始;
int右=结束;
国际公司;
while(left=start);//当前right大于或等于pivot时
if(左<右){
交换(字,左,右);
}
}
交换(字,开始,--左);
快速排序(单词,0,左-1);
快速排序(单词,左+1,结束);
}
整数比较(字符*w1,字符*w2){
而(*w1!='\0'&&&*w2!='\0'){
如果(*w1<*w2){
返回-1;
}否则,如果(*w1>*w2){
返回1;
}否则{
w1++;
w2++;
}
}
如果(*w1==*w2)
返回0;
否则如果(*w1=='\0')
返回-1;
否则返回1;
}
这是完整的代码


我认为问题的原因可能是在做的时候。我的指针做得很差。。我将非常感谢你的帮助。我刚开始学C,它简直要了我的命(

有很多错误(稍后会有更多的错误),但我必须首先指出:

不要为快速排序实现传递右/左索引标记。你不需要它们,它们给一般算法带来的复杂性也不值得。这是C。这样你就可以免费获得指针算法。使用它,尽情享受它。这样,你的算法就减少到一个可以实现偏移魔法的地方。剩下的就变成了t里维埃尔

但首先,从你的比较者开始,做一些一般性的内务管理。你可以判断这是否更简单:

int compare(char const *w1, char const *w2)
{
    while(*w1 && *w2)
    {
        if (*w1 < *w2)
            return -1;

        if (*w2++ < *w1++)
            return 1;
    }
    return *w2 ? -1 : (*w1 != 0);
}
关于你问题的实质(有多个)。首先,你到底想用这个来完成什么:

要测试这一点,请使用一个简单的随机字符串生成实现:

int main()
{
    srand((unsigned int)time(NULL));

    // allocate a string bed of 100 pointers
    static const size_t len = 100;
    char **arr = malloc(sizeof(*arr) * len);

    // populate with random strings ranging from 5 to 8 chars.
    for (size_t i=0; i<len; ++i)
    {
        int siz = 5 + rand() % 4;
        arr[i] = malloc(siz+1);
        for (size_t j=0; j<siz; ++j)
            arr[i][j] = 'A' + rand() % 26;
        arr[i][siz] = 0;
    }
    quicksort(arr, len);

    for (size_t i=0; i<len; ++i)
    {
        printf("%s\n", arr[i]);
        free(arr[i]);
    }
    free(arr);
}

你能解释一下你为什么要把字符***作为输入吗?我能理解两颗星(对于一个字符串数组),但是第三颗星我不太确定。我不明白你为什么要把
交换
变得不必要的复杂。如果交换一个“数组”的两个元素,传递一个指向该“数组”的指针是无意义的。
end
是最后一个元素吗?(通常是数组的长度,因此
end
指向最后一个单词之外).OT:在
compare
的第一行中,你只需要检查一个单词的结尾是否为零。@chris erm…1.我不知道如何用其他方法来做…我刚开始学习C.2.我仍然需要练习指针。它们让我很痛苦。@Jongware是的,end是最后一个索引。为什么我只检查一个单词?我怎么知道是什么ch one较短?我有一个问题。我想你主要是声明指针到指针数组。在快速排序方法中,你也传递指针到指针。为什么?它不应该是指针到指针的指针吗?你能解释一下-srand((unsigned int)time(NULL));和char**arr=malloc(sizeof(*arr)*len;@PutinHuylo后者为运行库PRNG种子,供以后生成字符串时使用。对于前者,不,它不需要是指针^3。我正在修改指针指向的内容(一个
char*
序列),而不是指针本身。它不需要通过地址传递。我只对它的值感兴趣(这是指针数组的基址)。
    do{
        char* w1 = (*words)[++left];
        char* w2 = (*words)[start];
        comp = compare(w1, w2);
    }while(comp < start)
void quicksort(char **words, size_t len)
{
    if (len < 2)
        return;

    char const *pvt = words[len/2];
    size_t lhs = 0, rhs=len-1;

    while( lhs < rhs )
    {
        while (compare(words[lhs], pvt) < 0)
            ++lhs;

        while (compare(words[rhs], pvt) > 0)
            --rhs;

        if (lhs <= rhs)
            swap_ptrs(words+lhs++, words+rhs--);
    }

    quicksort(words, rhs+1);
    quicksort(words+lhs, len-lhs);
}
int main()
{
    srand((unsigned int)time(NULL));

    // allocate a string bed of 100 pointers
    static const size_t len = 100;
    char **arr = malloc(sizeof(*arr) * len);

    // populate with random strings ranging from 5 to 8 chars.
    for (size_t i=0; i<len; ++i)
    {
        int siz = 5 + rand() % 4;
        arr[i] = malloc(siz+1);
        for (size_t j=0; j<siz; ++j)
            arr[i][j] = 'A' + rand() % 26;
        arr[i][siz] = 0;
    }
    quicksort(arr, len);

    for (size_t i=0; i<len; ++i)
    {
        printf("%s\n", arr[i]);
        free(arr[i]);
    }
    free(arr);
}
ARSXTGA
ATQYX
BCFNHSN
BEDYEW
BGTYDCK
BSYNEB
BYQXH
BYXVID
CHXQVEVG
CLRLYLO
DEXTPQO
DXHAIP
ECLMAD
EPYCQJ
EPZGNCG
EUUWTXOI
FEABB
FFMCTK
FYOIIKX
FZQWIQ
GDDUOMO
GFJNWEKP
GGMHDPA
GQMSEU
HTPCU
HULIENC
IGNHGIMM
ITFPMUAM
IYHBOWJ
IYTDAOEE
JEQVXRZ
JMUCWRV
JUDMWMS
KHVKN
KJOJXNL
KQIVURG
KVIGK
KVUYIER
LACVY
LCEKGER
LGELOIY
MILDEFJI
MNZDX
MOBOAPYL
MOLDKACO
MUJXDGH
NDZZLRQD
NEZTSBPC
NLDHM
OAZSW
OLPKKL
OZOBK
PBIOISM
PCYHNYQ
PEZMH
PFWEJQI
PIXNQ
PZATCAIK
QJUYGNID
QKGDXI
QLGORE
QULGW
RBEDK
ROYSAPGH
RQTVMO
RTBGDBXM
SLHUOE
SLTBOETM
SNRIGY
SRBPOF
STGPU
STUOQ
SXZFPRR
TBRFT
TELZYQ
TJKWLLE
TKLSNN
TNATOPFQ
UJXGWM
UNQZSF
VCLZUWSV
VPJVAEP
WBVBY
WDVWTEF
WEPRL
WFTJSFIQ
WUIJQS
WWPOAQQ
XLASZMI
XOQTSPZ
XQZZSZ
YFHXA
YFXMKAC
YPPUC
YRLVS
YTGHWVU
YWXOWXL
ZLVTUL
ZUNMCE
ZUUQZXLX