C++ 按字母顺序选择排序程序的问题

C++ 按字母顺序选择排序程序的问题,c++,selection-sort,alphabetical-sort,C++,Selection Sort,Alphabetical Sort,我有一个关于选择排序概念的家庭作业问题。我们得到了一个框架代码,我们需要在其中完成bool compare(…)和void selectionsort(…)函数,我已经完成了这项工作。然后,运行程序应按字母顺序对main()中给出的字符串进行排序,并在打印初始字符串后按字母顺序进行打印。然而,我的并没有按字母顺序排序,在尝试更改多个内容后,我一直在想原因 请注意,我只允许编辑compare和selectionsort方法,没有其他内容。我们需要在selectionsort方法中使用compare

我有一个关于选择排序概念的家庭作业问题。我们得到了一个框架代码,我们需要在其中完成
bool compare(…)
void selectionsort(…)
函数,我已经完成了这项工作。然后,运行程序应按字母顺序对
main()
中给出的字符串进行排序,并在打印初始字符串后按字母顺序进行打印。然而,我的并没有按字母顺序排序,在尝试更改多个内容后,我一直在想原因

请注意,我只允许编辑
compare
selectionsort
方法,没有其他内容。我们需要在
selectionsort
方法中使用
compare
方法(如果第一个字符串在字母表中出现得比另一个字符串早,则返回true),以便对它们进行比较,而不是简单的比较
语句

我相信我的问题与
for
循环中的
if
语句有关,但我很难找到正确的方法。任何帮助都将不胜感激

#include<iostream>
using namespace std;

bool compare(char *str1, char *str2, int strLen1, int strLen2) { // complete this method
    int small;
    if(strLen1 > strLen2)
        small = strLen2;
    else
        small = strLen1;

    //compare lexicographic values
    for(int i=0; i<small;i++){
        if(str1[i] < str2[i])
            return true;
        else if (str2[i] < str1[i])
            return false;
    }

    if (strLen1 < strLen2)
        return true;
    else
        return false;
}

void selectionsort(char **strings, int numStrings, int *eachStringLen) { // complete this method
    /* strings = jagged array
    numStrings = numRows
    eachStringLen = numColumnsInEachRow*/

    for(int i=0; i<numStrings-1;i++){
        int minIndex = i;
        if(compare(strings[i], strings[i+1], eachStringLen[i], eachStringLen[i+1]) == false){
        for(int j=i+1;j<numStrings;j++){
            if(strings[j]<strings[minIndex])
                minIndex = j;
        }
    }

        //swap strings[minIndex] and strings[i]
        char *tempA = strings[i];
        strings[i] = strings[minIndex];
        strings[minIndex] = tempA;

        int tempB = eachStringLen[i];
        eachStringLen[i] = eachStringLen[minIndex];
        eachStringLen[minIndex] = tempB;

    }//end for i
}//end selectionsort

int main() {
    char str0[] = { 'a', 'b', 'c' };
    char str1[] = { 'x', 'y', 'z', 'w' };
    char str2[] = { 'x', 'y', 'z', 'a', 'b' };
    char str3[] = { 'a', 'b', 'c', 'd', 'x' };
    char str4[] = { 'w', 'x', 'c', 'd', 'x' };
    char str5[] = { 'a', 'b', 'c', 'x', 'y' };
    char str6[] = { 'a', 'a', 'c' };
    char str7[] = { 'w', 'x', 'c', 'd', 'x' };
    char str8[] = { 'a', 'b', 'c', 'x'};
    char *strings[] = { str0, str1, str2, str3, str4, str5, str6, str7, str8 };
    int eachStringLength[] = { sizeof(str0) / sizeof(char), sizeof(str1)
            / sizeof(char), sizeof(str2) / sizeof(char), sizeof(str3)
            / sizeof(char), sizeof(str4) / sizeof(char), sizeof(str5)
            / sizeof(char), sizeof(str6) / sizeof(char), sizeof(str7)
            / sizeof(char), sizeof(str8)
            / sizeof(char) };
    int numStrings = 9;
    cout << "*** Original Strings ***" << endl;
    for (int i = 0; i < numStrings; i++) {
        for (int j = 0; j < eachStringLength[i]; j++) {
            cout << strings[i][j];
        }
        cout << endl;
    }
    selectionsort(strings, numStrings, eachStringLength);
    cout << endl << "*** Sorted Strings ***" << endl;
    for (int i = 0; i < numStrings; i++) {
        for (int j = 0; j < eachStringLength[i]; j++) {
            cout << strings[i][j];
        }
        cout << endl;
    }
}
#包括
使用名称空间std;
bool比较(char*str1,char*str2,int-strLen1,int-strLen2){//完成此方法
int小;
如果(strLen1>strLen2)
小=strLen2;
其他的
小=strLen1;
//比较字典值

对于(inti=0;i您的排序逻辑有点不正确。您需要两个循环,就像O(N^2)和

外部循环应该迭代每个索引i。内部循环应该找到范围i到N中的最小元素,并将其与i处的元素交换

我还建议您使用
std::swap
使代码更具可读性

因此,代码的内容应该如下所示:

for(int i=0; i<numStrings;++i){
    int minIndex = i;
    for(int j=i+1;j<numStrings;++j){
        if(compare(strings[j], strings[minIndex], eachStringLen[j], eachStringLen[minIndex])){
            minIndex = j;
        }
    }

    std::swap(strings[i], strings[minIndex]);
    std::swap(eachStringLen[i], eachStringLen[minIndex]);
}//end for i

@是的,这是我们收到的代码的一部分,无法编辑。我想这只是用来计算数组
eachStringLength[]中的每个值I/COD> IMO,无论谁给你这个任务,都需要自己的C++编程课程。你需要从 i开始查找所有字符串的最小索引,然后交换。你缺少一个内循环。注意,如果你的方法有效,那么你就可以实现一个n阶比较排序。另外,您可以只使用
std::swap
而不是一个临时变量和三行代码。对于所有的C++代码,您可以用
stdio.h
替换
iostream
,用
printf
替换
cout
,它将是C。还请注意
*strings[]
不是指向字符串的指针数组,而是指向字符数组的指针数组。没有nul终止。
eachStringLength[]
元素是每个数组中元素的数量,原因相同。所有这些都很好,但代码中使用了非常混乱的误称,将事物命名为“字符串…”。哦,我明白了,我查错了所有的地方,而我对
比较
函数的输入是个问题。谢谢!但是,输出仍然有点不正确,不完全按字母顺序排列;也就是说,当查看第二个字母时,字符串“abc”在“aac”之前打印,“a”显然在“b”之前。然后我是否必须在(int j
中添加第三个嵌套循环,以检查每个字符串的第二个字母?不。两个循环就足够了。检查您的代码,您应该会得到我发布的输出。啊,是的,我错了。我把
比较(…)搞砸了
函数试图修复输出,但当我尝试您的解决方案时,却完全忘记了我所做的更改。现在效果非常好,非常感谢!
*** Original Strings ***
abc
xyzw
xyzab
abcdx
wxcdx
abcxy
aac
wxcdx
abcx

*** Sorted Strings ***
aac
abc
abcdx
abcx
abcxy
wxcdx
wxcdx
xyzab
xyzw