要实现对任意List<T>对象的排序,首先要实现一个T元素的比较函数,可以声明一个委托:
然后就可设计排序函数了,排序的算法很多,这里用一种效率比较高的算法
使用时只要自己实现 Comparer函数就可以了,
如:
当然有些系统类本身就已经实现了 Comparer函数了,如string.Comparer()
调用例子:
大家如果有兴趣可以比较一下与List.Sort()排序的效率,呵呵
/// <summary>
/// 用于元素比较的委托
/// </summary>
public delegate int Comparer < T > (T first, T second);
/// 用于元素比较的委托
/// </summary>
public delegate int Comparer < T > (T first, T second);
然后就可设计排序函数了,排序的算法很多,这里用一种效率比较高的算法
public
static
void
Sort
<
T
>
(List
<
T
>
list,
int
left,
int
right,Comparer
<
T
>
Comparer)
{
int i, j;
T middle;
i = left;
j = right;
middle = list[(left + right) / 2]; //求中间值
do
{
while ((Comparer(list[i],middle) > 0) && (i < right))//从左扫描小于中值的元素
i++;
while ((Comparer(list[j], middle) < 0) && (j > left))//从右扫描大于中值的元素
j--;
if (i <= j)//找到了一对值
{
//交换
T temp;
temp = list[i];
list[i] = list[j];
list[j] = temp;
i++;
j--;
}
} while (i <= j);//如果两边扫描的下标交错,就停止(完成一次)
//当左边部分有值(left<j),递归左半边
if (left < j)
Sort(list, left, j,Comparer);
//当右边部分有值(right>i),递归右半边
if (right > i)
Sort(list, i, right,Comparer);
}
{
int i, j;
T middle;
i = left;
j = right;
middle = list[(left + right) / 2]; //求中间值
do
{
while ((Comparer(list[i],middle) > 0) && (i < right))//从左扫描小于中值的元素
i++;
while ((Comparer(list[j], middle) < 0) && (j > left))//从右扫描大于中值的元素
j--;
if (i <= j)//找到了一对值
{
//交换
T temp;
temp = list[i];
list[i] = list[j];
list[j] = temp;
i++;
j--;
}
} while (i <= j);//如果两边扫描的下标交错,就停止(完成一次)
//当左边部分有值(left<j),递归左半边
if (left < j)
Sort(list, left, j,Comparer);
//当右边部分有值(right>i),递归右半边
if (right > i)
Sort(list, i, right,Comparer);
}
使用时只要自己实现 Comparer函数就可以了,
如:
private
static
int
Comparer(
int
first,
int
second)
{
return first-second;
}
{
return first-second;
}
当然有些系统类本身就已经实现了 Comparer函数了,如string.Comparer()
调用例子:
string
[] aaa
=
{ "3", "1", "7", "5", "4", "2", "6" }
;
List < string > list = new List < string > (aaa);
Sort(list, 0 , 6 , string .Compare);
for ( int i = 0 ; i < 7 ; i ++ ) Console.WriteLine(list[i]);
List < string > list = new List < string > (aaa);
Sort(list, 0 , 6 , string .Compare);
for ( int i = 0 ; i < 7 ; i ++ ) Console.WriteLine(list[i]);
大家如果有兴趣可以比较一下与List.Sort()排序的效率,呵呵