快速排序

快速排序流行的原因是它实现简单、适用于不同的输入数据且一般应用中比其他算法都要快的多

基本算法

    快速排序是一种分治的排序算法。它将一个数组分成两个数组,将两部分独立的排序。快速排序和归并排序是互补的:归并排序是将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序;而快速排序将数组排序的方式是当两个子数组有序时,整个数组也就自然有序了。归并,递归发生在处理整个数组之前;第二种情况,递归调用发生在处理整个数组之后。
实现过程算法如下:

    快速排序递归地将子数组a[lo...hi]排序,先用partition()方法将a[j]放到一个合适的位置,然后在递归调用其他位置的元素排序。
  该方法的关键在于切分,这个过程使得数组满足下面三个条件:
  A.对于某个j,a[j]已经排定;
  B.a[lo]到a[j-1]中所有元素都不大于a[j].
  C.a[j+1]到a[hi]中所有的元素都不大于a[j].
性能:
   1.快速排序切分方法的内循环会用一个递增的索引将数组元素和一个定值比较。归并排序和希尔排序一般都比快速排序慢,其原因就是在内循环中移动数据。

   算法改进

1.对于小数组,快速排序比插入排序慢;
2.因为递归,快速排序的sort()方法在小数组中也会调用自己。
3.实际应用中经常出现含有大量重复元素的数组,在有大量重复元素的情况下,快速排序的递归性会使元素全部重复的子元素经常出现。一个简单的想法就是将数组切分三部分,分别对应小于、等于、大于切分元素的数组元素。
“三向切分快速排序”:它从左到右遍历一次,维护一个指针lt使得a[lo,lt-1]中的元素都小于v,一个指针gt使得a[gt+1,hi]中的元素都大于v,一个指针i使得a[lt,i-1]的元素都等于v.
代码如下:

三向切分最坏的情况是所有主键都不相同。当存在重复主键时,它的性能会比归并排序好得多。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值