算法 快速排序

       /// <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)

posted @ 2021-05-23 23:47  luytest  阅读(50)  评论(0编辑  收藏  举报