结构推理 利用快速排序,求出所有关键字值小于k的元素,放到一端,并给出个数的非递归算法。
【正确答案】在表尾增加一个关键字值等于k的元素,将该元素与第一个元素互换位置,然后进行一趟快速排序,则支点前的所有元素的关键字值均小于k。
   #define MAXSIZE 100
   #de fine KEYTYPE int
   typedef struct
   { KEYTYPE key;
   }RECORDNODE;
   int part(RECORDNODE r[],int low,int high)
   { int i,j;
       i=low;j=high;
       r[0]=r[i];
       while(i<j)
       { while(i<j&&r[j].key>=r[0].key)
               j--;
           if(i<j)
           {  r[i]=r[j];i++;)
           while(i<j&&r[i].key<=r[0].key)
               i++;
           if(i<j)
           {r[j]=r[i];j--;)
       }
       r[i]=r[0];
       return i;
   }
   int quicksortk(RECORDNODE r[],int n,int k)
   {  int i;
       RECORDNODE x;
       x.key=k;
       r [n+1]=r[1];    /*将数组1单元的数据放在n+1单元*/
       r[1]=x;    /*将关键字为k的元素放在数组的1单元*/
       i=part(r,1,n+1);
       return(i-1);
   }
   main()
   {  RECORDNODE r[HAXSIZE];
       int i,n,k,j;
       printf("请输入记录个数:");
       scanf("/%d",&n);
       printf("请输入记录的关键字值:");
       for(i=1;i<=n;i++)
       scanf("/%d",&r[i].key);
       printf("请输入k值:");
           scanf("/%d",&k);
       j=quicksortk(r,n,k);
       printf("小于k的元素个数为:/%d\n",j);
       printf("这些记录分别是:");
       for(i=1;i<=j;i++)
           printf("/%d",r(i].key);
   }
【答案解析】