快速排序

快速排序(重要,用的很多)

一个引入例子

  1. 荷兰国旗问题
    • 荷兰国旗问题就是指,给定一个目标数target和目标数组array,设计一个方法,使得该数组中大于target的数都放在左边,小于target的数都放在右边,等于target的数都放在中间.
    • 步骤:
      1. 设计一个左边界,使其初始位置在下标0的左边一位.
      2. 设计一个右边界,使其初始位置在最后一个元素下标的的右边一位即array.length.
      3. 给定一个计数变量cur,记录当前数组中第几个数在被操作比较.
      4. 如果array[cur] > target,则左边界的下一位数和当前位置的数交换,同时左边界移动到下标为1的位置,即左边界++右移一位,以及当前位置下移一位.
      5. 如果array[cur] < target,则右边界的前一位数和当前位置的数交换,同时右边界下标为array.length - 1的位置,即右边界--左移一位,注意,此时当前位置不移动,因为交换过来的数没有进行判断.
      6. 如果array[cur] == target,不坐任何操作,当前位置++.
    • 这个代码其实很简单,可能我说不是很好理解,我直接贴代码: 荷兰国旗问题代码.
    • 其时间复杂度为o(N),额外空间复杂度为O(1).

根据荷兰国旗问题的快速排序

  1. 快速排序怎么排?

    1. 给定一个数组[1,2,3,4,5,4,3],然后把数组的最后一个数1作为比较的数.
    2. 和最后一个数1相比,跟荷兰国旗一样,小的放左边,大的放右边,等于的放中间.
    3. 然后再去对小于区和大于区这样做
    4. …如此循环下来,数组就有序了.
    5. 快速排序代码.
    6. 这种快排别经典快排要快一些,经典快排一次只排一个数,而这种一次可以把相等的都放好,反正我学了这种我就把经典快排忘了哈哈哈.
  2. 它的时间复杂度:

    1. 当已经有序的来排序的时候,例如[1,2,3,4,5,6],来排序的时候,每次都用最后一个去比较,每次都只能排序一个,这样子的左右部分规模差别很大的时候,时间复杂度为O(N^2).
    2. 最好的情况是,每次左边界和右边界的数都差不多相等,然后就是一个递归的过程,时间复杂度就和归并一样了,为O(N*logN).
    3. 这就是经典快排的缺点,和数据的状况有一定关系.

随机快排

  1. 随机快排就是指在给定排序的数组中随机选择一个数去作为本次的参照数,虽然这样子还是有可能出现左右部分的规模差别很大,不过这个就是概率问题了,所以这样的快排时间复杂度就只能用平均时间复杂度,也就是我们的期望值来表示.
  2. 这个时间复杂度就记住就可以了,反正我不会证明,数学不好,随机快排期望时间复杂度为: O(N*logN),额外空间复杂度为O(log(N))(这个就可以理解为每次断点打在中间,因为要记录相等点的位置,所以浪费了空间,最差额外空间是O(N),因为就相当于每个点都要记下来).
  3. 随机快排相较于上面的快排就只多了一行代码,这行代码使得我们随机找出来一个数作为最后一个数,也就是参照数哈哈哈,我在代码里标注出来了,代码: 随机快排代码.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值