排序之 快排

排序之 快排

序言

快速排序是常用的排序算法之一,也是面试的时候经常会问到的,它是冒泡排序的改进,不稳定,时间复杂度 最理想 O(nlogn) 最差时间O(n^2),采用了 挖坑法+分治法

基本思想

它的基本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。在冒泡排序中,一次扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只减少1。快速排序通过一趟扫描,就能确保某个数(以它为基准点吧)的左边各数都比它小,右边各数都比它大。然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。简单来说就是执行以步骤:

(数组a[],low是头部下标,high是尾部下标,temp是基数)

  1. 寻找一个基数(通常是第一个数)
  2. 先从数组的最尾部开始比较,如果a[high]>=temp,往前移位继续比较,如果小,就执行 a[low]=a[high],然后从a[low]开始比较,执行a[low]<=temp,如果下于,则low++继续比较,如果大于的话,a[high]=a[low];
  3. 执行完2以后,low就是基数的下标,然后a[low]=temp,
  4. 然后从基数的下标分位 a[low],middle-1 ,middel+1,a[high] 继续执行2,3 步骤,如果low>=high不成立,则f返回排序的结果。

从上面步骤可以看出来,快排的效率取决去基数的选择,最理想的情况就是基数正好就是中间数。

代码实现

`

public class QuickSort{
public void quick(int [] a){
    if(a.length>0){
        quickSort(a,0,a.length-1);
    }
}

public void quickSort(int [] a, int low, int heih){
    if(low<high){
        int middle=getMiddle(a,low,high);
        quickSort(a,low,middle-1);
        quickSort(a,middle+1,high);
    }
}

public int getMiddle(int [] a,int low ,int high){
    int temp=a[low];基准元素
    while(low<high){
        while(low<hight&&a[high]>=temp){
            hihgh--;
        }
        a[low]=a[high];
        while(low<high&&a[low]<=temp){
            low++;
        }
        a[high]=a[low];
    }
    a[low]=temp;
    return low;

}}

`

快速排序还有很多改进版本,如随机选择基准数,区间内数据较少时直接用另的方法排序以减小递归深度。有兴趣的同学可以深入研究研究,,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值