c++ - 仅使用iostream按字母顺序对二维数组进行冒泡排序?

标签 c++ arrays sorting c++11

我想弄清楚如何按字母顺序对单词列表进行排序。我现在拥有的代码将对它们进行正确排序,前提是每个单词只有 1 个字母。一旦我移动到更多字母,它就会失败。你能帮我解决这个问题吗?谢谢

我的输入文件是:

Emma
Liam
Dill
Bill
Kimm
Jacks
John
Hats
Julia
Jill

代码:

#include <iostream>
#include <fstream>
using namespace std;

void sort(char input[10][25], int size);

int main(){
    char input[10][25] = {"Emma", "Liam", "Dill", "Bill", "Kimm", "Jacks", "John", "Hats", "Julia", "Jill"};

    sort(input,10);

    cout << "Sorted:\n";
    for(int i = 0; i < 10; i++){
        cout << input[i];
    }

    return 0;
}


void sort(char input[10][25],int size){

    char temp;
    for(int k = 0;k < 10;k++){
        for(int i = 0; i < 9; i++){
            for(int j = 0; j < 24; j++){
                if(input[i][j] > input[i+1][j]){
                    temp = input[i][j];
                    input[i][j] = input[i+1][j];
                    input[i+1][j] = temp;
                }
            }
        }
    }

}

最佳答案

您的代码的主要问题是,当 1 个单词需要与另一个单词交换时,您不会交换数组中的两个单词。相反,您只交换第一个单词的字符,它们比第二个单词的字符大。这会造成困惑。

例如,当您尝试交换以下两行时

SALLY
MOMMA

你的最终结果是:

MALLA
SOMMY

另一个问题包括缺少“John”和“Hats”之间的逗号,导致数组中只有 9 个条目,其中一个是“JohnHats”。

最后,冒泡排序需要在循环中使用不同的索引来保留已经排序的元素。

使用辅助函数有助于使这一点更加清晰。这是一个示例解决方案,与您最初编写的内容很接近,但带有辅助函数。

#include <iostream>
#include <fstream>
using namespace std;

bool smaller(char input[10][25], int a_index, int b_index) {
    char* a = input[a_index];
    char* b = input[b_index];
    for (int i = 0; a[i] != 0 && b[i] != 0; i++) {
        cout << a[i] << " " << b[i];
        if (a[i] > b[i]) {
            return false;
        } else if (a[i] < b[i]){
            return true;
        }
    }
    return true;
}

void swap(char input[10][25], int a, int b) {
    for(int i = 0; i < 25; i++){
        char temp = input[a][i];
        input[a][i] = input[b][i];
        input[b][i] = temp;
    }
}

void sort(char input[10][25], int size){
    char temp;
    for(int k = 0; k < 10; k++){
        for(int i = k + 1; i < 10; i++){
            if (smaller(input, i, k)) {
                swap(input, i, k);
            }
        }
    }
}

int main(){
    char input[10][25] = {"Emma", "Liam", "Dill", "Bill", "Kimm", "Jacks", "John", "Hats", "Julia", "Jill"};

    sort(input,10);

    cout << "Sorted:\n";
    for(int i = 0; i < 10; i++){
        cout << input[i];
    }

    return 0;
}

关于c++ - 仅使用iostream按字母顺序对二维数组进行冒泡排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41990511/

相关文章:

python - 已排序的字典列表

Javascript 检查列表是否在一次交换后排序

c++ - 如何使 '<?=' 可用于 C++?

c++ - cmake生成汇编文件然后编译成可执行文件

c++ - C++ 标准库中有纯虚函数吗?

java - 如何查找二维字符数组中的字符频率?

java - 进行排列后,如何将它们添加到数组中? [ java ]

c++ - 在 gdb 中,我可以调用一些类函数,但其​​他的 "cannot be resolved"。为什么?

c - 重新分配多维数组

java - Collections.sort 错误 : no suitable method found for sort