快速排序

一 基本思想

  1. 通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

二 例子

    class QuickSort
    {
        public static void Sort(int[] array)
        {
            QSort(array, 0, array.Length - 1);
        }

        private static void QSort(int[] array, int low, int high)
        {
            int middle;
            if (low < high)
            {
                middle = Partiton(array, low, high);
                QSort(array, low, middle);
                QSort(array, middle + 1, high);
            }
        }

        private static int Partiton(int[] array, int low, int high)
        {
            int temp = array[low]; //设定一个参考值
            while (low < high) // 当 low =high 时, 所有比参考值小的都在左边, 比参考值大的都在右边, low就是参考值的下标
            {
                while (low < high && array[high] >= temp)  //先从后往前找, 找到第一个比参考值小的坐标
                {
                    high--;
                }
                array[low] = array[high];// 把当前找到的比参考值小的放在左边。
                while (low < high && array[low] <= temp) //然后从前往后找, 找到比参考值大的
                {
                    low++;
                }
                array[high] = array[low];// 把当前找到的比参考值大的放在右边。
            }
            array[low] = temp;
            return low;
        }
    }

三 复杂度分析

  1. 最优的情况(每次都是对半分),时间复杂度是 O(nlog₂n)。
  2. 最坏的情况,数据是正序或者逆序, 每次划分只得到一个比上一次划分少一个记录的子序列,另一个为空, 所以需要划分 n - 1 次, 而且 第 i 次划分 需要经过 n - i 次比较才能找到第 i 个记录, 因此比较次数为 (n-1) + (n-2)+ ``````+ 1 = n(n-1)/2.。也就是时间复杂度为O(n²)。
  3. 平均情况下, 时间复杂度为O(nlog₂n)。
  4. 空间复杂度,主要是递归造成的栈空间的使用, 最好情况,递归树的深度是log₂n, 空间复杂度O(log₂n), 最坏情况, 需要进行n-1次递归, 空间复杂度是O(n)。平均情况是O(log₂n)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值