好的,我一直在使用此代码对整数进行选择排序:
public void selectSort(int [] arr)
{
//pos_min is short for position of min
int pos_min,temp;
for (int i=0; i < arr.Length-1; i++)
{
pos_min = i; //set pos_min to the current index of array
for (int j=i+1; j < arr.Length; j++)
{
if (arr[j] < arr[pos_min])
{
//pos_min will keep track of the index that min is in, this is needed when a swap happens
pos_min = j;
}
}
//if pos_min no longer equals i than a smaller value must have been found, so a swap must occur
if (pos_min != i)
{
temp = arr[i];
arr[i] = arr[pos_min];
arr[pos_min] = temp;
}
}
}
但是现在我想在字符串列表上运行相同的算法。怎么能做到?感觉真的很尴尬,就像您需要其他循环来比较不同字符串的多个字符时一样。我做了很多尝试,但没有任何有用的建议。 :/
注意:我知道,选择排序不是很有效。这仅用于学习目的。我不是在寻找已经包含在C#中的替代算法或类。 ;)
IComparable
是一个接口,为我们提供了一个称为CompareTo的函数,该函数是比较运算符。该运算符适用于实现IComparable
接口的所有类型,其中包括整数和字符串。
// Forall types A where A is a subtype of IComparable
public void selectSort<A>(A[] arr)
where A : IComparable
{
//pos_min is short for position of min
int pos_min;
A temp;
for (int i=0; i < arr.Length-1; i++)
{
pos_min = i; //set pos_min to the current index of array
for (int j=i+1; j < arr.Length; j++)
{
// We now use 'CompareTo' instead of '<'
if (arr[j].CompareTo(arr[pos_min]) < 0)
{
//pos_min will keep track of the index that min is in, this is needed when a swap happens
pos_min = j;
}
}
//if pos_min no longer equals i than a smaller value must have been found, so a swap must occur
if (pos_min != i)
{
temp = arr[i];
arr[i] = arr[pos_min];
arr[pos_min] = temp;
}
}
}
System.String
类具有静态的int Compare(string, string)
方法,如果第一个字符串小于第二个字符串,则返回负数;如果相等,则返回零;如果第一个字符串大于则返回正数。
用“较小”表示,它按词法顺序排在另一个之后,而按较大词法按词法顺序排在另一个之后。
因此,您可以比较int Compare(string, string)
而不是整数的String.Compare(arr[j], arr[pos_min]) < 0
。