快速排序
/// <summary>
/// 快速排序,稳定算法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="arr"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public static IList<T> QuickSort<T>(IList<T> arr) where T : IComparable
{
return QuickSort(arr,0, arr.Count);
}
/// <summary>
/// 快速分组排序
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="arr"></param>
/// <param name="lo"></param>
/// <param name="hi"></param>
private static IList<T> QuickSort<T>(IList<T> arr, int lo, int hi) where T : IComparable
{
if (hi <= lo)
{
return arr;
}
int partion = QuickSortPartion(arr, lo, hi);
QuickSort(arr, lo, partion - 1);
QuickSort(arr, partion + 1, hi);
return arr;
}
/// <summary>
/// 分区,小的放左边,大的放右边
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="arr"></param>
/// <param name="lo"></param>
/// <param name="hi"></param>
/// <returns></returns>
private static int QuickSortPartion<T>(IList<T> arr, int lo, int hi) where T : IComparable
{
T key = arr[lo];//暂定第一个值为分界值
int left = lo, right = hi + 1;//定义两个指针,初始指向最小索引和最大索引的下一个位置
while (true)
{
while (key.CompareTo(arr[--right]) < 0)
{
if (right == lo)
{
break;
}
}
while (key.CompareTo(arr[++left]) > 0)
{
if (left == lo)
{
break;
}
}
if (left >= right)
{
break;
}
else
{
arr.Swap(left, right);
}
}
arr.Swap(lo, right);
}