C# MVC环境下快速排序无结果输出问题排查求助
排查C#快速排序无输出结果的问题
嘿,我看了你这段快速排序的代码,能理解你碰到这种没报错但没输出的情况有多头疼——毕竟同环境下归并排序都正常跑。咱们一步步拆解问题所在:
几个关键错误点
- 第二个while循环索引误用:原代码里第二个while判断的是
char.Parse(ListLetters[i]) > pivot,但这里应该用ListLetters[j]!你要找的是右侧区间里比pivot小的元素,结果一直拿左侧的i索引元素来判断,这会导致逻辑完全混乱,甚至可能让循环卡死,排序根本无法正常执行。 - Pivot取值错误:你现在取的是原始
Word字符串的中间字符Word[(left + right)/2],但Word从始至终都没被修改过,而你实际要排序的是ListLetters列表。递归过程中ListLetters的元素已经被交换,pivot却还是从原始字符串里拿,这完全不符合快速排序的逻辑,应该从ListLetters当前区间的中间位置取元素。 - 递归内重复拼接字符串:你把拼接
arrangedSort的foreach循环放在了aQuicksort方法内部,每次递归调用都会执行一次拼接。这不仅会让字符串被重复拼接N次,而且递归过程中ListLetters还没完成排序,拼接出来的结果也是混乱的。正确做法是等整个递归排序完成后,再去拼接最终结果。 - 冗余参数传递:
aQuicksort方法里的Word参数完全没用,你排序的是ListLetters,传原始Word进去只会混淆逻辑,应该删掉这个参数。
修正后的代码
public string QuickSort() { string arrangedSort = ""; string word = "cdabe"; List<string> listLetters = new List<string>(); for (int i = 0; i < word.Length; i++) { listLetters.Add(word.Substring(i, 1)); } // 调用修正后的快排方法,无需传递原始word参数 aQuicksort(listLetters, 0, listLetters.Count - 1); // 排序完成后再拼接最终结果 foreach (var letter in listLetters) { arrangedSort += letter; } return arrangedSort; } // 修正后的快排方法,接收要排序的列表作为核心参数 private void aQuicksort(List<string> listLetters, int left, int right) { int i = left; int j = right; // 从当前排序区间的列表中取pivot,转成char简化比较逻辑 char pivot = char.Parse(listLetters[(left + right) / 2]); while (i <= j) { // 左侧找到第一个>=pivot的元素 while (char.Parse(listLetters[i]) < pivot) i++; // 右侧找到第一个<=pivot的元素(修正了索引j的使用) while (char.Parse(listLetters[j]) > pivot) j--; if (i <= j) { // 交换左右指针指向的元素 var tmp = listLetters[i]; listLetters[i] = listLetters[j]; listLetters[j] = tmp; i++; j--; } } // 递归处理左右子区间 if (left < j) aQuicksort(listLetters, left, j); if (i < right) aQuicksort(listLetters, i, right); }
额外优化建议
- 可以把
List<string>改成List<char>,这样不需要每次调用char.Parse,代码更简洁且效率更高。 - 字符串拼接建议用
StringBuilder代替直接+=,尤其是处理较长字符串时,能显著提升性能。
内容的提问来源于stack exchange,提问作者anony
相关产品推荐
相关产品推荐

