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

快速排序

时间:2015-08-29 17:05:28      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:快速排序

顾名思义,快速排序(quicksort)是在实践中最快的一致排序算法,它的平均运行时间是O(NlogN)。该算法之所以特别快,主要是由于非常精炼和高度优化的内部循环。它的最坏情形的性能为O(N^2),但稍加努力就可以改变这种情形。
像归并排序一样,快速排序也是一种分治的递归算法。将数组S排序的基本算法由下列简单的四步组成:
(1)如果S中元素个数是0或1,则返回。
(2)取S中任一元素v,称之为枢纽元(pivot)。
(3)将S-{v}(S中其余元素)划分成两个不相交的集合:S1={x属于S-{v} ,x<=v}和S2={x属于S-{v}|x>=v}。
(4)返回{quicksort(S1),后跟v,继而{quciksort(S2)}.
选取枢纽元的方法
三数中值分割法:
一组N个数的中值是第N/2个最大的数。枢纽元的最好的选择是数组的中值。可是,这很难算出,并且会明显减慢快速排序的速度。这样的中值并没有多大的帮助,因此一般的做法是使用左端,右端和中心位置上的三个元素的中值作为枢纽元。例如,输入为8,1,4,9,6,3,5,2,7,0,它的左边元素是8,右边元素是0,中心位置上的元素是6。于是枢纽元则是v=6。显然使用三数中值分割法消除了预排序输入的不好情形。
小数组
对于很小的数组(N<=20),快速排序不如插入排序好。而且,因为快速排序是递归的,所以这样的情形经常发生。通常的解决方法是,对于小的数组不递归地使用快速排序,而代之以诸如插入排序这样的对小数组有效的排序算法。使用这种策略大约可以节省15%的时间。一种好的截止范围是N=10,虽然在5~20之间任一截止范围都有可能产生类似的结果。

快速排序的驱动程序
/**
* Quicksort algorithm (driver).
* /
template <typename Comparable> 
void quicksort( vector<Comparable> & a)
{
     quicksort(a,0,a.size() -1 );
}
执行三数中值分割方法的程序
/**
* Return median of left, center, and right.
* Order these and hide the pivot.
* /
template <typename Comparable>
const Comparable & median3( vector<Comparable> & a, int left,int right)
{
   int center=(left+right) /2 ;
   if(a[center] <a[left] )
      swap( a[left],a[center]);
   if(a[right] <a[left] )
       swap(a[left],a[right] );
   if(a[right] <a[center] )
       swap( a[center],a[right]);

      //Place pivot at position right -1, because a[right] > a[center]
   swap(a[center],a[right-1]);
   return a[right-1];
}
快速排序的主程序
/**
* Internal quicksort method that makes recursive calls.
* Uses median-of-three partitioning and c cutoff of 10.
* a is an array of Comparable items.
* left is the left-most index of the subarray.
* right is the right-most index of the subarray.
* /

template <typename Comparable>
void quicksort(vector<Comparable> & a, int left, int right)
{
    if( left + 10 <= right )
    {
        Comparable pivot=median3(a,left,right);
             //Begin partitioning
         int i=left,j=right-1;
         for( ; ; )
         {
             while(a[++i] < pivot ) {}
             while(pivot < a[--j] ) {}
             if(i<j)
                 swap(a[i],a[j]);
             else
                  break;
         } 
         swap(a[i],a[right-1] ); //Restore pivot
         quicksort(a,left,i-1);  //Sort small elements
         quicksort(a,i+1,right);  // Sort large elements
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

快速排序

标签:快速排序

原文地址:http://blog.csdn.net/hacker_no_1/article/details/48087813

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