快速排序算法是我经常使用的算法,所以也写成了泛型了,省事,不用为每个类型去写个特定的算法了。
排序的对象是实现了IList接口的集合。
我已经发了一个查找类,经常都要一起使用的。
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Data;
namespace
CommonLibrary
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// Sorter 排序类
/// </summary>
public class Sorter
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 两个值的比较委托
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="value1">值1</param>
/// <param name="value2">值2</param>
/// <returns>返回值,值1大于值2返回1,值1小于值2返回-1,值1等于值2返回0</returns>
public delegate int Compare<T>(T value1, T value2);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 二分排序法
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="myList">要进行排序的集合</param>
/// <param name="myCompareMethod">两个值的比较方法</param>
public static void DimidiateSort<T>(IList<T> myList, Compare<T> myCompareMethod)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
DimidiateSort<T>(myList, 0, myList.Count-1, myCompareMethod);
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 二分排序法
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="myList">要进行排序的集合</param>
/// <param name="left">起始位置</param>
/// <param name="right">结束位置</param>
/// <param name="myCompareMethod">两个值的比较方法</param>
public static void DimidiateSort<T>(IList<T> myList, int left, int right, Compare<T> myCompareMethod)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (left < right)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
T s = myList[(right + left) / 2];
int i = left - 1;
int j = right + 1;
T temp = default(T);
while (true)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
do
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
i++;
}
while (i < right && myCompareMethod(myList[i], s) == -1);
do
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
j--;
}
while (j > left && myCompareMethod(myList[j], s) == 1);
if (i >= j)
break;
temp = myList[i];
myList[i] = myList[j];
myList[j] = temp;
}
DimidiateSort(myList, left, i - 1, myCompareMethod);
DimidiateSort(myList, j + 1, right, myCompareMethod);
}
}
}
}