面试的一道机试题: 排序 难度(**)

来源:互联网 发布:淘宝的wap是什么意思 编辑:程序博客网 时间:2024/05/16 05:05

题目:插入数据,并排序

要求:1、随机插入不重复数据

            2、排序,并在排序中可以输入数据控制进程

话说这道题排序不成问题,要说难点的话也就出在上述两个要求上吧。当时机试的电脑是一台HP的笔记本,里面能用的编译器也就是Microsoft Visual Studio 2005,我先用上面附带的PlusEdit文本编辑器早早的编辑好了一下C代码。然后瞅瞅Microsoft Visual Studio 2005有没有工程能够编译代码的,由于从来没用过,短时间找不到。面试我的人上网找了Tubor C 2.0帮我应了下急。在这里感慨一下Tubor C 2.0调试代码真难用。

话归正传,讲一讲我如何解决上述两条要求的。

先看一下变量定义,如果有变量不清楚的话,可以到这儿查

 

    int i, j, k;
    
int a[100];
    
int b[100];
    
int temp,temp1;
    
int flag=1;
    
int enquire=1;

 

1、随机插入不重复数据

      for(i=0;i<100;i++)
           b[i]=i;
//数组随机数赋值,0~99,并且不重复
    srand((unsigned)time(NULL));
    
for(i=0;i<100;i++)
    
{
        j
=99-i;
        
do{
            temp
=rand();
        }
while(temp<0||temp>j);
        a[i]
=b[temp];
        temp1
=b[j];
        b[j]
=b[temp];
        b[temp]
=temp1;
    }

首先先定义一个同样大小的数组,赋值。注意这儿的所赋的值其实就是所有传递给目标数组的随机数的范围。我做好后,面试官问我,你做的随机数范围是0~99,那如果换个范围呢。我说,只要改变数组b的范围就行了。当然用我的方法还有一个附带的好处就是,即使随机数可能取的一样,赋值的数值也不会相同。

当时一直在想C里有没有取的随机数函数能限定范围的,打开头文件stdlib.h一看没有看到有这样的函数。于是用了一个do while循环给随机数函数取得值限定范围,貌似会影响效率的说。

2、排序,并在排序中可以输入数据控制进程

 

/*冒泡排序,并在每次循环输出中间结果后任意输入一个值,
    1、如果介于该次循环与100之间的数,输出该值对应的循环中间结果。
    2、如果输入-1,直接输出最终结果。
    3、如果输入0,则程序停止运行。
    4、如果输入其它数值,则输出下一次的循环中间结果。
*/

    
for(i=99;i>=0;i--)
    
{
        
for(j=0;j<i;j++)
        
{
            
if(a[j]>a[j+1])
            
{
                temp
=a[j+1];
                a[j
+1]=a[j];
                a[j]
=temp;
            }

        }

        
        
if(enquire)
        
{
            printf(
" Press any number to continue... ");
            scanf(
"%d",&flag);
        }


        
if(flag>100-i&&flag<100)
        
{
            enquire
=0;
        }
else if(flag==-1)
        
{
            enquire
=0;
        }
else if(!flag)
        
{
            exit(
0);
        }
else
        
{
            enquire
=1;
            printf(
"%dth result ",100-i);
            
for(k=0;k<100;k++)  
            
{
                printf(
"%2d ",a[k]);
                
if((k+1)%10==0) printf(" ");
            }

        }

    }

 

后来回到家,自己的电脑Visual Studio 2008上折腾这道题,Project types 选择Visual C++,新建Win32 Console Application项目。在Solusion Explorer的Resouce Files右键添加文件,文件后缀.c,编译运行,成功跳出黑框框。看来就不需要vc6.0了。