【正确答案】在表尾增加一个关键字值等于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);
}
【答案解析】