分割算法的调试与控制
接上一篇随笔,在上篇我自己写的代码中,当首位数字在后面中再次出现,又会出现没有及时跳出循环的情况,这里采用了极其无奈的写法,使用goto语句,一个break语句跳不出两个循环,每判断一次就要检查high与low是否相等。有一位同学提供了一种算法,辅助数组标记了比initial_num大与小的数组序号,可以选择打印,同时分开的两组数字的原始顺序与输入次序相差不大
//这里是引入数组b
include <stdio.h>
define N 9
int main()
{
int n;
scanf("%d",&n);
while(n>0)
{
int a[N]={0};
int b[N]={0};
for(int i=0;i<N;i++)
scanf("%d",&a[i]);
for(int i=1;i<N;i++)
{
if(a[i]<a[0]) b[i]=1;//小的数标记为1
if(a[i]>a[0]) b[i]=2;//大的数标记为2
}
for(int i=N;i>0;i--)
if(b[i]==1) printf("%d ",a[i]);//选择打印
printf("%d ",a[0]);//分割元素
for(int i=0;i<N;i++)
if(b[i]==2) printf("%d ",a[i]);
printf("\n");
n--;
}
} //该算法结束
int m;//下面是再次修改的代码,low与high要每次判断,代码越来越长(无奈)。
scanf("%d",&m);
while(m>0)
{
int a[N]={0};
for(int i=0;i<N;i++)
scanf("%d",&a[i]);
int initial_num=a[0];
int high=N-1,low=0;
while(1)
{
if(low==high)
{
a[high]=initial_num;
goto end;
}
while(a[high]>initial_num)
{
high--;
if(low==high)
{
a[high]=initial_num;
goto end;
}
}
if(a[high]<=initial_num)
{
a[low]=a[high];
a[high]=initial_num;
low++;
if(low==high)
{
a[high]=initial_num;
goto end;
}
}
while(a[low]<initial_num)
{
low++;
if(low==high)
{
a[high]=initial_num;
goto end;
}
}
if(a[low]>=initial_num)
{
a[high]=a[low];
a[low]=initial_num;
high--;
if(low==high)
{
a[high]=initial_num;
goto end;
}
}
}
end:
for(int i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
m--;
}

浙公网安备 33010602011771号