问答题 设有顺序放置的n个桶,每个桶中装有一粒砾石,每粒砾石的颜色是红、白、蓝之一。要求重新安排这些砾石,使得所有红色砾石在前,所有白色砾石居中,所有蓝色砾石居后。重新安排时,对每粒砾石的颜色只能查看一次,并且只允许交换操作来调整砾石的位置。【上海大学1999二、2(18分)】
【正确答案】正确答案:一趟快速排序可以将序列划分成两部分,这里要求一趟排序将序列分成三部分。设3个指针i、j和k,将r[1..j一1]作为红色,r[,..k-1]为白色,r[k.n]为蓝色。为方便处理,将三种砾石的颜色用整数1、2和3表示。核心语句段如下: int i=1,j=1,k=n,temp; while(j<=k) if(r[j]==1) //当前元素是红色 {temp=r[i];r[i]=r[j];r[j]=temp ; i++;j++;} else if(r[j]==2)j++; //当前元素是白色 else //(r[j]=3 当前元素是蓝色 {temp=r[j]; r[j]=r[k]; r[k]=temp;k一一;}
【答案解析】