在C++中使用驱动程序测试选择排序的问题求助
搞定字符串选择排序的测试问题
嘿,我来帮你解决这个困扰!其实字符串数组的选择排序测试,核心思路和数值数组是相通的——只是要注意字符串本身的比较规则,我一步步给你拆解:
首先先把你没写完的代码补全,C++里的std::string本身支持<、>这类比较运算符,默认是按ASCII码顺序(也就是大小写敏感的字母序,比如大写字母会排在小写前面,毕竟'A'的ASCII值是65,'a'是97)来对比的,所以选择排序的逻辑和数值数组几乎一致:
#include <iostream> #include <string> using namespace std; void selectionSort(string arr[], int size) { int minIndex; string minValue; for (int start = 0; start < (size - 1); start++) { minIndex = start; minValue = arr[start]; for (int index = start + 1; index < size; index++) { // 直接用string自带的比较运算符,默认就是字母序(大小写敏感) if (arr[index] < minValue) { minValue = arr[index]; minIndex = index; } } swap(arr[minIndex], arr[start]); } } void displayArray(string arr[], int size) { for (int i = 0; i < size; i++) { cout << arr[i] << " "; } cout << endl; }
接下来是测试驱动程序,核心就是准备测试用例→排序→和预期结果对比,我给你写个完整的示例:
测试驱动代码示例
int main() { // 测试用例1:混合大小写的字符串数组 string testArr1[] = {"Banana", "apple", "Cherry", "date", "Blueberry"}; int size1 = sizeof(testArr1) / sizeof(testArr1[0]); cout << "排序前的数组:"; displayArray(testArr1, size1); selectionSort(testArr1, size1); cout << "排序后的数组:"; displayArray(testArr1, size1); // 验证结果是否符合预期(注意默认ASCII顺序,大写字母在前) string expectedArr1[] = {"Banana", "Blueberry", "Cherry", "apple", "date"}; bool test1Passed = true; for (int i = 0; i < size1; i++) { if (testArr1[i] != expectedArr1[i]) { test1Passed = false; cout << "测试用例1失败:第" << i+1 << "个元素不对,预期是" << expectedArr1[i] << ",实际是" << testArr1[i] << endl; break; } } if (test1Passed) { cout << "测试用例1通过!" << endl; } // 测试用例2:全小写字符串,验证纯字母序 string testArr2[] = {"zebra", "apple", "cat", "dog", "elephant"}; int size2 = sizeof(testArr2) / sizeof(testArr2[0]); cout << "\n排序前的数组:"; displayArray(testArr2, size2); selectionSort(testArr2, size2); cout << "排序后的数组:"; displayArray(testArr2, size2); string expectedArr2[] = {"apple", "cat", "dog", "elephant", "zebra"}; bool test2Passed = true; for (int i = 0; i < size2; i++) { if (testArr2[i] != expectedArr2[i]) { test2Passed = false; cout << "测试用例2失败:第" << i+1 << "个元素不对,预期是" << expectedArr2[i] << ",实际是" << testArr2[i] << endl; break; } } if (test2Passed) { cout << "测试用例2通过!" << endl; } return 0; }
几个关键提醒
- 大小写敏感问题:如果需要忽略大小写的字母序排序,得修改排序里的比较逻辑,比如把每个字符转成小写后再对比,用
std::lexicographical_compare配合自定义谓词就行:
对应的测试用例预期也要改成忽略大小写的顺序,比如// 忽略大小写的比较逻辑 if (lexicographical_compare(arr[index].begin(), arr[index].end(), minValue.begin(), minValue.end(), [](char a, char b) { return tolower(a) < tolower(b); })) { minValue = arr[index]; minIndex = index; }"apple"会排在"Banana"前面。 - 测试用例要全面:别忘了覆盖空数组、单元素数组、已经有序的数组、逆序数组、包含重复字符串的数组,这样才能确保你的排序函数足够鲁棒。
如果你的代码里还有其他细节问题,比如displayArray的实现bug,或者排序逻辑的疏漏,可以把完整代码贴出来,我再帮你排查~
内容的提问来源于stack exchange,提问作者user9307501
相关产品推荐
相关产品推荐

