排序算法:快速排序

快速排序是一种高效的排序算法,由Tony Hoare发明,平均时间复杂度为O(nlog(n))。它采用分治法,通过选取基准元素进行分区操作,将数列分为小于和大于基准的两部分,再对这两部分递归排序。在数据杂乱无章的场景下,快速排序的效率尤为显著。
摘要由CSDN通过智能技术生成

介绍:

快速排序通常明显比同为O(nlogn)的其他算法更快,因此常被采用,而且快排采用了分治法的思想,所以在很多笔试面试中能经常看到快排的影子。可 见掌握快排的重要性。
快速排序(Quick Sort)由图灵奖获得者Tony Hoare发明,被列为20世纪十大算法之一,是迄今为止所有内排序算法中速度最快的一种。冒泡排序的升级版,交换排序的一种。快速排序的时间复杂度为O(nlog(n))。

  • 时间复杂度:最优:O(nlog(n)) 最差O(n2) 平均O(nlog(n))
  • 空间复杂度:
    消耗空间的是递归调用,因为每次递归就要保持一些数据
    最优:O(logn) 每一次都平分数组的情况
    最差:O( n ) ;退化为冒泡排序的情况
  • 适用场景:数据杂乱无章的场景,而且越乱,快速排序的效率越体现的淋漓尽致。

排序思想:

  1. 从数列中挑出一个元素,称为"基准"(pivot)也称之为哨兵
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准 值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后, 该基准就处于数列的中间位置。这个称为分区(partition)操作。
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数 列排序。
  4. 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代 (iteration)中,它至少会把一个元素摆到它最后的位置去。

简单来说就是选择一个哨兵元素,并以其为基准分为比他大的和比他小的两部分,在对这两部分分别选取哨兵执行相同操作,依次循环。

public class QuickSort {
   
    public static void main(String[] args){
   
        int[] arr = new int[]{
   4,3,2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值