类别:排序-交换排序 参看 维基百科的定义 using System; using System.Collections.Generic; namespace Com.Colobu.Algorithm.Exchange { /// <summary> /// <b>快速排序</b>是所有排序算法中最高效的一种. /// 它采用了分治的思想:先保证列表的前半部分都小于后半部分, /// 然后分别对前半部分和后半部分排序,这样整个列表就有序了。 /// 这是一种先进的思想,也是它高效的原因。 /// 因为在排序算法中,算法的高效与否与列表中数字间的比较次数有直接的关系, /// 而"保证列表的前半部分都小于后半部分"就使得前半部分的任何一个数从此以后 /// 都不再跟后半部分的数进行比较了,大大减少了数字间不必要的比较。 /// /// 平均时间复杂度:O(nlogn) /// Stability:No /// </summary> public class QuickSortAlgorithm { // QuickSort implementation public static void QuickSort<T>(IList<T> szArray, int nLower, int nUpper) where T : IComparable { if (nLower < nUpper) { int nSplit = Partition(szArray, nLower, nUpper); QuickSort(szArray, nLower, nSplit - 1); QuickSort(szArray, nSplit + 1, nUpper); } } // QuickSort partition implementation private static int Partition<T>(IList<T> szArray, int nLower, int nUpper) where T:IComparable { T szPivot = szArray[nLower]; //分隔点的值,用数字第一个值代替 int nLeft = nLower + 1;//左边开始点 int nRight = nUpper; //右边开始点 T szSwap; //交换变量 //开始查找 //将小于分隔点的值都挪到左边 //将小于分隔点的值都挪到右边 while (nLeft <= nRight) { //找到左边第一个大于分隔点的值 while (nLeft <= nRight && szArray[nLeft].CompareTo(szPivot) <= 0) nLeft = nLeft + 1; //找到右边第一个小于分隔点的值 while (nLeft <= nRight && szArray[nRight].CompareTo(szPivot) > 0) nRight = nRight - 1; //如果左右还没有交叉(碰头),交换左右两个值 if (nLeft < nRight) { szSwap = szArray[nLeft]; szArray[nLeft] = szArray[nRight]; szArray[nRight] = szSwap; nLeft = nLeft + 1; nRight = nRight - 1; } } //将分隔点移动到最后那个点,此时nRight = nLeft - 1 //所以那个点的值小于分隔点,可以与分隔点进行交换 szSwap = szArray[nLower]; szArray[nLower] = szArray[nRight]; szArray[nRight] = szSwap; //现在在nRight左边的值都小于分隔点,nRight右边的值都大于分隔点 return nRight; } } }