我遇到一个涉及“选择排序”概念的家庭作业问题。我们获得了一个框架代码,我们需要在其中完成bool compare(...)
和void selectionsort(...)
函数。然后,运行程序应按字母顺序对main()
中给出的字符串进行排序,并在打印初始字符串后按字母顺序打印它们。但是,我的字母排序不是按字母顺序排序,在尝试更改多项内容后,我仍然想找出原因。
请注意,我只能编辑compare
和selectionsort
方法,没有别的。我们需要在compare
方法中使用selectionsort
方法(如果字母中第一个字符串比另一个字符串早,则返回true),以便比较它们,而不是简单比较< > =
语句。
我相信我的问题与if
循环中的for
语句有关,但是我在找出正确的方法方面遇到了很多麻烦。任何帮助将不胜感激!
#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;
}
}
答案 0 :(得分:1)
您的排序逻辑略有偏离。您需要两个循环,因为selection sort是O(N ^ 2),而no comparison sort can be faster than O(NlogN)是
。外部循环应遍历每个索引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
请注意,您可以编写外部循环以在i<numStrings
而不是i<numStrings-1
上继续,因为最后一个元素将必然与自身交换。但是两种退出条件都可以。
输出为:
*** Original Strings ***
abc
xyzw
xyzab
abcdx
wxcdx
abcxy
aac
wxcdx
abcx
*** Sorted Strings ***
aac
abc
abcdx
abcx
abcxy
wxcdx
wxcdx
xyzab
xyzw