我想弄清楚如何按字母顺序对单词列表进行排序。我现在拥有的代码将对它们进行正确排序,前提是每个单词只有 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/