八大排序之一:快速排序。
快速排序可能是最常被提到的排序算法了,快排的思想是,选取第一个数为基准,通过一次遍历将小于它的元素放到它的左侧,将大于它的元素放到它的右侧,然后对它的左右两个子序列分别递归地执行同样的操作。
/// <summary> /// 快速排序 /// </summary> /// <param name="array">数组</param> /// <param name="left">起始位</param> /// <param name="right">终点位</param> public void QuickSort(int[] array,int left,int right) { //左下标一定小于右下标,否则就超越了 if (left < right) { //对数组进行分割,取出下次分割的基准标号 int i = Division(array, left, right); //对“基准标号“左侧的一组数值进行递归的切割,以至于将这些数值完整的排序 QuickSort(array, left, i - 1); //对“基准标号“右侧的一组数值进行递归的切割,以至于将这些数值完整的排序 QuickSort(array, i + 1, right); } } /// <summary> /// 分治 /// </summary> /// <param name="list">需要分治的数组</param> /// <param name="left">左边标记</param> /// <param name="right">右边标记</param> /// <returns></returns> int Division(int[] array, int left,int right) { int baseNum = array[left]; while (left < right) { while (left < right && array[right] >= baseNum) { right--; } array[left] = array[right]; while (left < right && array[left] <= baseNum) { left++; } array[right] = array[left]; } array[left] = baseNum; return left; }
不同的排序算法使用的场合也不尽相同,快排虽然总体的平均效率O(nlogn)最好,但是也有极端机框,如果需要排列的数组是一个已经倒序数组,那么排序的效率就只有O(n^2)了,所以快速排序也是一个不稳定排序,具体情况具体分析也是很重要的。