QuickSort分析,这是回复提问时碰到的,顺便对学过的算法进行复习,总结...

来源:互联网 发布:java constructor类型 编辑:程序博客网 时间:2024/05/22 13:26

这个算法与C语言数据结构是的有所不同,不过性质一样都是采用分治法来实现的
平均时间复杂度为O(nlgn) ,最坏为O(n^2)
主要思想就是维持两个区间,左区间的元素小于mid,右区间则反之,对区间元素进行处理 

void   QuickSort(vector <int> & v,   int   low,   int   high)
{
        int   temp;

        if(low <high)
        {
                int   midPos=low;
                int   mid=v[low];
              //每次循环目的是为了在[low,   high]区间确定里v[low]的位置, 
              //始终维持两个区间左区间(小于v[low]),右区间(大于v[low])
              //即midPos划分出左区间[low+1,midPos]和右区间[midPos+1,high]两部分,递归分治将大的区间分成小区间
                //midPos所指向的位置永远是在左区间的第后个元素,也是最终v[low](mid)排序后的位置
                for(int   i=low+1;i <=high;++i)       
                {    
                                 
                //如果v[i]> =mid,即该元素为属于右区间即大于mid的区间,直接将i=i+1,midPos值不变,可以知道在[midPos+1,i]区间元素为右区间
                 
                //v[i] <mid里则v[i]应该不属于右区间中(然而我们必须得维持[midPos+1,i]为右区间),利用交换v[i]与v[midPos+1]的值(v[midPos+1]为右区间的第一个元素)并且将midPos=midPos+1(使midPos再次指向左区间的未端),这样保证[low+1,midPos]为左区间,[midPos+1,i]为右区间,通过交换同时把小于mid的v[i]元素放入[low+1,midPos]中
                 
                        if(v[i] <mid   &&   ++midPos!=i)   //避免是相等的时候
                        {                                
                                temp=v[i];
                                v[i]=v[midPos];
                                v[midPos]=temp;
                        }
                }
                  //循环结束后,区间[low+1,high]划分成[low+1,midPos],[midPos+1,high],这样递归直到每个区间只剩下两元素 
                  //一次递归只是将v[low]元素值的位置确定了下来,并以midPos为划分点,在其左边的所有元素值一定比它小,
                //右边所有的元素都比它大,所以v[low]排序后位置通过一次循环就固定了
                //处理v[low],将其与midPos元素的位置交换就行,这就是v[low]排序后的位置
                temp=v[low];                                        
                v[low]=v[midPos];
                v[midPos]=temp;
                //完成以对v[midPos]位置的排序后,对子区间进行分而治之...
                QuickSort(v,   low,   midPos-1);   //对左区间[low,midPos-1]进行递归
                QuickSort(v,   midPos+1,   high);//对右区间[midPos+1,midPos+1]进行递归
        }

 

原创粉丝点击