分割算法的调试与控制

接上一篇随笔,在上篇我自己写的代码中,当首位数字在后面中再次出现,又会出现没有及时跳出循环的情况,这里采用了极其无奈的写法,使用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--;
}
posted @ 2020-11-19 23:44  empty_thought  阅读(140)  评论(0)    收藏  举报