数据结构定义和算法--排序--快速排序

算法原理

  1. 如果要排序下标为p到r之间的一组数组;
  2. 选择p到r之间任意一个元素做pivot(分区点),将小于pivot的元素放在左边,大于pivot的放在右边,pivot放在中间。这样数组就被分为三个部分,小于pivot的区间A[p, q-1]、等于pivot的区间A[q]、大于pivot的区间A[q+1, r];
  3. 根据分治思想和递归编程技巧,我们可以用递归排序区间A[p, q-1]和区间A[q+1, r],直到区间缩小为1,就说明数组有序了;

如何实现

  1. 递推公式:quick_sort(p, r) = quick_sort(p, q-1) + quick_sort(q+1, r);
  2. 终止条件:p >= r;

算法稳定性

因为区分过程中涉及交换操作,如果数组中有两个8,一个是pivot,经过分区处理后,后面的8可能放到前面去了。比如数组[]1,2 , 3, 9, 8, 11, 8],取后面的8做pivot,那么分区后就会将后面的8与9进行交换。因此,快速排序不是稳定排序算法。

时间复杂度

快速排序也是用递归实现的,因此时间复杂度也可以用递归公式表示。

  1. 最好情况:每次分区都可以将数组分为大小差不多相等的两部分,这时候时间复杂度为O(nlog);
  2. 最差情况:如果某个数组是已经排序好的,那么每次得到的两个区间都极端不等,那么就需要n次分区,每次需要平均扫描n/2个元素,这种情况下快排的时间复杂度就是O(n^2);比如([0, 1, 2 , 3, 4, 5, 6, 7, 8, 9])
  3. 平均情况:快速排序算法大部分情况下时间复杂度为O(nlogn),只有在极端情况下才会退化到O(n^2),我们也有很多可以降低这个概率;

空间复杂度

快排是一种原地排序算法,因此空间复杂度为O(1)。

《数据结构与算法之美》 -- 王争

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值