码迷,mamicode.com
首页 > 编程语言 > 详细

经典算法-快速排序

时间:2016-05-09 12:28:50      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:

    1. 快速排序是一种分治的算法,它是将一个数组分成两个数组,经两个数组进行独立排序。

    2.快速排序和归并排序是互补的:归并排序在递归调用发生在处理数组之前,快速排序发生在递归调用排序之后,在归并排序中,一个数组被等分为两半,在快速排序中,切分(partition)位置取决于数组的具体内容。

     如图所示:

技术分享

算法实现:

     

 1 public class quick
 2 {
 3    public static void sort(Comparable[] a)
 4   {
 5     StdReadom.shuffle(a);//消除对于原数组的依赖
 6     sort(a,0,a.length-1);
 7    }
 8    private static void sort(Comparable[]a,int lo,int hi)
 9   {
10    if(hi<=lo)
11      return;
12    int j=partion(a,lo,hi);//切分函数
13    sort(a,lo,j-1);将左半部分进行从lo到j-1的排序
14    sort(a,j,hi);将左半部分进行从j到hi的排序
15    }
16 }

    快速排序的切分

 1 private static void partion(Comparable[]a,int lo,int hi)
 2 {
 3    //将数组切分为a[lo,...,i-1],a[i],a[i+1,...,hi]
 4    int i=lo,j=hi+1;//扫描左右指针
 5    Comparable v=a[lo];//切分元素
 6    while(true)
 7    {
 8      //扫描左右元素,检查扫描是否结束并且交换元素
 9      while(less(a[++i],v)) if (i==hi) bresk;
10      while(less(v,a[--j])) if (j==lo) bresk;
11     //less(a,b)函数实现的是如果a<b,返回ture,否则为false;
12     if(i>=j)  break;
13     exch(a,i,j);//该函数实现的是交换a[i],a[j]
14    }
15     exch(a,lo,j);//将切分元素放在正确的位置
16     return j;//切分元素将左右
17 }
下面是切分展示(每次交换前后的数组内容):
技术分享     注意事项:
    1.原地划分:如果使用一个辅助数组,我们可以容易的实现划分,但是将划分之后的数组复制回原来的数组,这部分开销是我们得不偿失,大大降低排序速度
    2.不要越界:如果切分元素是数组中最大或者最小的那个元素,小心指针抛出数组边界
    3.保持随机性:数组元素在开始进行消除对数组的输入依赖,对所有子数组一视同仁
    4.终止递归:快速排序的常见错误就是不能保证把切分元素放置正确的位置,导致程序在切分元素正好是子数组最大或者最小的情况下,陷入无限循环之中
  

 
 

 

经典算法-快速排序

标签:

原文地址:http://www.cnblogs.com/lujun1949/p/5473272.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!