八大排序之一:快速排序。

快速排序可能是最常被提到的排序算法了,快排的思想是,选取第一个数为基准,通过一次遍历将小于它的元素放到它的左侧,将大于它的元素放到它的右侧,然后对它的左右两个子序列分别递归地执行同样的操作。

/// <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)了,所以快速排序也是一个不稳定排序,具体情况具体分析也是很重要的。