我有一个关于使用 C# 排序的问题。我想实现一个函数来按字母顺序对字符串数组(例如 ["AA", "A", "Z", "ZZZ"])进行排序,而不需要任何内置排序方法。我尝试过一些比较函数和我的逻辑,即比较两个字符串的每个字符,但它无法正常工作。
如果您比较两个长度相同的字符串(例如“A”和“Z”),则效果很好。问题是“Z”出现在“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)
{
int k = 0;
while (k < Math.Min(copy_database[j].Value.Title.Length, copy_database[j + 1].Value.Title.Length) &&
copy_database[j].Value.Title[k] == copy_database[j + 1].Value.Title[k])
{
k++;
}
if (k < Math.Min(copy_database[j].Value.Title.Length, copy_database[j + 1].Value.Title.Length))
{
if (copy_database[j].Value.Title[k] < copy_database[j + 1].Value.Title[k])
{
// Swap elements
Key_Value_Pair temp = copy_database[j];
copy_database[j] = copy_database[j + 1];
copy_database[j + 1] = temp;
break;
}
}
else
{
break;
}
请不要将所有内容都塞进一个例程中,提取方法。我们这里有
让我们先比较字符串
private static int CompareStrings(string left, string right) {
if (left is null)
return right is null ? 0 : -1;
if (right is null)
return +1;
for (int i = 0; i < Math.Min(left.Length, right.Length); ++i)
if (left[i] < right[i])
return -1;
else if (left[i] > right[i])
return +1;
return left.Length < right.Length ? -1
: left.Length > right.Length ? +1
: 0;
}
然后对数组进行排序
private static void SortArray<T>(T[] array, Func<T, T, int> sort) {
ArgumentNullException.ThrowIfNull(array);
ArgumentNullException.ThrowIfNull(sort);
for (bool hasWork = true; hasWork;) {
hasWork = false;
for (int i = 0; i < array.Length - 1; ++i) {
if (sort(array[i], array[i + 1]) > 0) {
hasWork = true;
(array[i], array[i + 1]) = (array[i + 1], array[i]);
}
}
}
}
最后我们可以放
SortArray(copy_database, CompareStrings);