算法 快速排序

Posted luytest

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法 快速排序相关的知识,希望对你有一定的参考价值。

       /// <summary>
        /// 快速排序,随机(第一个)值,通过比较令左边都是小于它的,右边都是大于它的
        /// 以它为分割点,再递归对左右两边的无序数组进行相同操作,直到数组不可再分
        /// 其实就是每次确认取出的值在整个数组中应当处于的位置,其他部分只跟它做大小比较
        /// </summary>
        /// <param name="array">要排序的数组</param>
        /// <param name="left">数组起始下标</param>
        /// <param name="right">数组最大下标</param>
        public static void kuaisu(int[] array, int left, int right)
        {
            if (left < right)
            {
                //拿到mid说明已经找到一个位置
                int mid = kuaisu_partion(array, left, right);
                //以mid为分割,对左右侧进行同样的操作
                kuaisu(array, left, mid - 1);
                kuaisu(array, mid + 1, right);
            }
        }

        /// <summary>
        /// </summary>
        /// <param name="array">要排序的数组</param>
        /// <param name="left">数组起始下标</param>
        /// <param name="right">数组最大下标</param>
        public static int kuaisu_partion(int[] array, int left, int right)
        {
            int temp = array[left];
            while (left < right)
            {
                //从右往左开始比较,数组的值大于等于temp且没找到边界时,继续找
                while (array[right] >= temp && left < right)
                {
                    right--;//往左走一位
                }
                //找到比temp小的值后,将找到的值赋给left位置(空位)
                array[left] = array[right];
                //从左往右开始比较,数组的值小于等于temp且没找到边界时,继续找
                while (array[left] <= temp && left < right)
                {
                    left++;//往右走一位
                }
                //找到比temp大的值后,将找到的值赋给right位置(空位)
                array[right] = array[left];
            }
            //此时left = right,确定了取出的temp的真正位置
            array[left] = temp;
            Console.WriteLine("找到真正位置后temp归位:" + string.Join(\',\', array));
            return left;
        }
    }

这个比较复杂,总结一下就是,

1.取出数组的第一个值,腾出位置;

2.先从右往左比,把比它小的放到左边的空位,同时比它小 的那个值的位置腾出成为空位;

3.再从左(排除步骤1的第一个值,因为肯定比取出的值小,所以不需要比较)往右比较,找到比它大的放到步骤2腾出的空位上;

4.不停的进行2,3步,直到左边的值都小于步骤1取出的值,右边的值都大于取出的值;

5.以步骤1取出的值的位置为分割点,左右都递归执行1~4步。

 

时间复杂度是 O(nlogn)

以上是关于算法 快速排序的主要内容,如果未能解决你的问题,请参考以下文章

一行Python代码搞定快速排序算法

排序算法 | 快速排序(含C++/Python代码实现)

交换排序(冒泡排序快速排序的算法思想及代码实现)

快速排序/快速选择算法

快速排序算法详解及代码实现

排序算法——快速排序的图解代码实现以及时间复杂度分析