排序之 快排

来源:互联网 发布:ipad刷机软件 编辑:程序博客网 时间:2024/06/09 19:00

排序之 快排

序言

快速排序是常用的排序算法之一,也是面试的时候经常会问到的,它是冒泡排序的改进,不稳定,时间复杂度 最理想 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;}}

`

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

0 0