结构推理 上述用栈来代替递归实现快速排序的算法,在最差情况下栈有多深?怎样组织递归调用的顺序可以减小栈的深度?试在上面程序的基础上写出改进的非递归算法。
【正确答案】(1)数据结构
   SortObject的定义。
   (2)思路
   设有n个记录需要排序。在最差情况下,每趟分区使得左区长度为0。这时,栈的最大深度为2n,平均时间代价是O(n)。栈最深时的状态如下所示:
   0,-1,1,0,2,1,3,2,…,n-2,n-3,n-1,n-1,…
   可以修改上述算法,使得每次分区后,较长的区的两个边界先进栈,较短的区的两个边界后进栈。修改后的算法如下所示(加粗的部分是与原算法不同的地方)。
   (3)算法
   void qsort1(SortObject*pvector,int ol,int or){/*非递归快速排序*/
       int 1,r, pivotindex,i,j;
       DataType temp;
       RecordNode pivot;
       PSeqStack pastack=createEmptyStack_seq();
       /*一个栈,用来存放每个区的两个边界*/
       temp.left=ol;
       temp.right=or;
       push_seq(pastack,temp);    /*两个边界进栈*/
       while(!isEmptyStack_seq(pastack)){    /*每当栈不空*/
           temp=top_seq(pastack);
           1=temp.left;
           r=temp.right;
           pop_seq(pastack);    /*取栈顶,出栈*/
           if(1>=r){
               continue;
           }    /*只有一个记录或无记录,无需排序*/
           pivotindex=1;
           pivot=pvector->record[pivotindex];    /*取轴值*/
           i=1;
           j=r;
           while(i!=j){   /*寻找轴值的最终位置*/
               while((pVector->record[j].key>=pivot.key)&&(j>i))
                 j--;
           if(i<j)
                 pvector->record[i++]=pvector->record[j];
           while((pVecto->record[i].key<=pivot.key)&&(j>i))
                 i++:
       if(i<j)
           pvector->record[j--]=pvector->record[i];
       }
       pvector->record[i]=pivot;    /*找到轴值的最终位置*/
       if(r-i<i-l){    /*右区长度r-i小于左区长度i-l*/
           temp.left=1:
           temp.right=i-1:
           push_seq(pastack,temp);    /*左区两个边界先进栈*/
           temp.left=i+1:
           temp.right=r:
           push_seq(pastack,temp);    /*右区两个边界后进栈*/
       }
       else {    /*右区长度r-i大于等于左区长度i-l*/
           temp.left=i+1:
           temp.right=r:
           push_seq(pastack,temp);    /*右区两个边界先进栈*/
           temp.left=l:
           temp.right=i-l:
           push_seq(pastack,temp);    /*左区两个边界后进栈*/
       }
     }
   }
   (4)代价分析
   对于修改后的算法,栈最深的情形是每次分区的左右两区长度相等或相差1。这时,栈的最大深度为2[log2n+1)],平均时间代价是O(log2n)。其中,[n]表示不超过n的最大整数。与快速排序算法相同,该算法的平均时间复杂度为O(nlog2n)。
【答案解析】