快速排序

4 篇文章 0 订阅

1.需求:将一个无序的数组按从小到大的顺序排列

2.思想:众所周知交换排序中的冒泡排序的一般时间复杂度为O(n2),今天复习交换排序中的另外一种排序算法:快速排序,选取一个基准值,将数组中大于这个基准值的放到基准值一边,小的放到另外一边,然后对两边数组进行同样的操作。一般时间复杂度为O(nlog2(n))这里需要用到递归(顺便复习一下递归的概念:一个方法调用自己叫做递归。什么时候可以用递归呢?1.一个大的问题可以分解成同样的更小的问题。2有递归出口(递归何时结束的条件))

3.思路:一般选取数组的第一个值为基准值,我们要做的就是给他安个家,将他放到合适的位置。这里采用挖坑法:首先选出基准值,相当于在0位置挖了一个坑,然后从右往左找出第一个比基准值小的数取出来放到刚挖的坑里面,填了旧坑又出来新坑,然后从左往右找到第一个比基准值大的数将其填到新坑里面,当左边=右边的时候也就是找到了基准值的家了。然后采用递归分别对基准值的左边和右边做相同的操作,递归出口:当需要处理的数只有一个的时候。

4.实现:

public class Sort
    {
        /// <summary>
        /// 待排序数组
        /// </summary>
        public int[] arr { get; set; }


        /// <summary>
        /// 快速排序
        /// </summary>
        /// <param name="left">指向待处理数组的起始位置</param>
        /// <param name="right">指向待处理数组的结束位置</param>
        public void QuickSort(int left,int right)
        {
            if (arr == null)
            {
                throw new ArgumentException("未将待排序数组对象引用设置到实例");
            }
            if (left < right)
            {
                int i = left;//记录起始位置
                int j = right;//记录结尾位置
                int pivot = arr[left];//基准值


                while (i < j)
                {
                    //从右往左找出第一个比基准值小的数
                    while (j > i && arr[j] > pivot)
                        j--;
                    //填坑
                    arr[i] = arr[j];
                    //从左往右找出第一个比基准值大的数
                    while (i < j && arr[i] < pivot)
                        i++;
                    //填坑
                    arr[j] = arr[i];
                }
                arr[i] = pivot;
                QuickSort(left, i-1);
                QuickSort(i + 1, right);
            }
        }
    }
}

5.运行结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值