结构推理 编写非递归的快速排序算法。
【正确答案】(1)数据结构
   typedef int KeyType;
   typedef int DataType;
   typedef struct{
       KeyType key;    /*排序码字段*/
       DataType info;    /*记录的其他字段*/
   }RecordNode;
   typedef struct{
       intn;    /*n为文件中的记录个数*/
       RecordNode  *record;
   }SortObject;
   并采用栈的顺序表示:
   typedef struct{
       int left;    /*区间左端点*/
       int right;    /*区间右端点*/
   }DataType;
   struct SeqStack{
       DataType s[MAXNUM];  /*栈中每个元素是一个区间*/
       int t;
   };
   typedef struct SeqStack*PSeqStack;
   (2)思路
   利用栈,将教材中的递归的快速排序算法转换为与之等价的非递归的算法。需要注意的是栈中的每个元素是一个区间(用两个端点来表示)。
   (3)算法
   void nquicksort(sortobject*pvector){    /*非递归快速排序*/
       int 1,r,pivotindex,i,j;
       DataType temp;
       RecordNode pivot;
       PSeqStack pastack=createEmptyStack_seq();
       /*一个栈,用来存放每个区的两个边界*/
       temp.left=0;
       temp.right=pvector->n-1;
       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((pvector->record[i].key<=pivot.key)&&(j>i))
                 i++:
               if(i<j)
                 pvector->record[j--]==pvector->record[i];
           }
           pvector->record[i]=pivot;    /*找到轴值的最终位置*/
           temp.left=i+1:
           temp.right=r;
           push_seq(pastack.temp);    /*右区两个边界进栈*/
           temp.left=1:
           temp.right=i-1:
           push_seq(pastack,temp);    /*左区两个边界进栈*/
       }
   }
   (4)代价分析
   该非递归算法与教材中的递归的快速排序算法是等价的,平均时间代价为O(nlog2n)。
【答案解析】