如何在C#中正确排序不同长度的字符串数组(不使用内置排序)
解决不同长度字符串的自定义字典序排序问题
问题分析
你的代码存在两个核心问题,导致长短字符串排序异常:
- 前缀场景未处理:当一个字符串是另一个的前缀(比如
"AA"和"A"),代码在字符循环匹配结束后直接break,没有比较两者长度,导致长字符串错误排在短字符串前面。 - 交换逻辑颠倒:当前面字符串的字符小于后面时就交换,这会让大字符的字符串留在前面,完全反转了升序排序的逻辑。
正确的字典序规则
要实现标准字母排序,需遵循:
- 逐个字符比较,第一个不同字符ASCII值更小的字符串排前;
- 若一个字符串是另一个的前缀,较短的字符串排前(例如
"A" < "AA" < "AAA")。
修正后的代码实现
// 冒泡排序实现自定义字典序升序排序 for (int i = 0; i < copy_database.Length - 1; i++) { for (int j = 0; j < copy_database.Length - 1 - i; j++) { if (copy_database[j].Value != null && copy_database[j + 1].Value != null) { string str1 = copy_database[j].Value.Title; string str2 = copy_database[j + 1].Value.Title; int k = 0; int minLength = Math.Min(str1.Length, str2.Length); // 逐个字符匹配,直到找到不同字符或其中一个字符串结束 while (k < minLength && str1[k] == str2[k]) { k++; } bool needSwap = false; if (k < minLength) { // 找到不同字符:前面字符串的字符更大则需要交换(升序) needSwap = str1[k] > str2[k]; } else { // 前缀场景:前面字符串更长则需要交换(短字符串排前) needSwap = str1.Length > str2.Length; } if (needSwap) { // 交换两个元素 Key_Value_Pair temp = copy_database[j]; copy_database[j] = copy_database[j + 1]; copy_database[j + 1] = temp; } } } }
代码说明
- 提取两个字符串到临时变量
str1和str2,简化后续代码; - 字符循环结束后,分两种情况判断是否需要交换:
- 找到不同字符时,若
str1的字符更大,则交换,保证升序; - 前缀场景下,若
str1更长,则交换,让短字符串排前;
- 找到不同字符时,若
- 移除了多余的
break,确保冒泡排序的每一轮都能正确处理所有相邻元素。
测试验证
对于输入数组["AA", "A", "Z", "ZZZ"],排序后结果为:["A", "AA", "Z", "ZZZ"],符合预期的字典序规则。
内容的提问来源于stack exchange,提问作者Iku
相关产品推荐
相关产品推荐

