首页 > 编程语言 > 详细

算法 快速排序

时间:2021-05-24 00:55:58      阅读:25      评论:0      收藏:0      [点我收藏+]
       /// <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)

算法 快速排序

原文:https://www.cnblogs.com/luyShare/p/14802642.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!