题目(属于算法的):请问怎么样用六次比较来找到5个任意数的中间值。假设 a b c d e 我个数  有没有好的方法呢? 我在思考中...谢谢see see!

解决方案 »

  1.   

    有方法不知道好不好(自己认为不好)
    a|b   c|d   e
    相互比较
    用了两次机会 得到max(a,b),min(a,b),max(c,d),min(c,d),e
    把max(a,b)|max(c,d)   min(a,b)|min(c,d)  e
    比较用了两次(共4次了)得到max(a,b,c,d) 和min(a,b,c,d)
    从这五个树中排除max(a,b,c,d) 和min(a,b,c,d)
    只剩下三个数 假设x,y,z
    比较x|y  y|z,两次,(共六次)
    x>y && y>z
    x<y && y>z
    x<y %% y<z
    三种情况,三种结果
      

  2.   

    用快速排序法不行的吧?void quicksort(element list[],int left,int right){
        int pivot,i,j;
        element temp;
        if(left<right){
             i=left;j=right+1;
             pivot=list[left].key;
             do{
                do
                  i++;
                while(list[i].key<pivot);
                do
                  j--;
                while(list[j].key>pivot);
                if(i<j)
                   swap(list[i],list[j],temp);
             }while(i<j);
             swap(list[left],list[j],temp);
             quicksort(list,left,j-1);
             quicksort(lsit,j+1,right);
         }
    }
      

  3.   

    下面是别人给我的:第一次比较a与b。
    第二次比较c与d。这时有三种情况:一、两组数皆不等;二、一组数相等,另一组不等;三、两组数都相等。分别讨论:一、如果两组数皆不等,假定a>b,c>d,则比较b与c(这是第三次比较),又分三种情况:b>c,b=c,b<c。
    1. 若b>c,则知a>b>c>d,此时比较e与c(第四次比较),若e>c,则e为中数,否则,c是中数(两数相等时,两者都是中数)。
    2. 若b<c,则知已有两个数(d和b)小于c,因此,第四次可比较e与c,又有三种情况:
       a) 若e>c,则第五次比较a与c,此时,若a>c则c是中数(因为a和e都比c大,而b和d都比c小),若a=c则a和c都是中数,若a<c则需比较a与d(第六次比较),较大者即为中数,相等则都是中数。
       b) 若e<c,则比较e与b(第五次比较),用其中较大者与d比较(第六次),三数(b、d和e)中最大者便是中数(如果有相等的情况参看上文)
       c) 若e=c,则比较a与e(第五次比较),若a大则e和c是中数,若e大则a是中数,若一样大则a、c、e都是中数。
    3. 若b=c,则知a>b=c>d,故只需比较e与c(第五次比较),若一样大,则b、c、e都是中数,否则(无论e<c还是e>c)b、c都是中数。二、若有一组数相等(假定a>b,c=d),则比较b与c(第三次),分三种情况:
    1. 若b>c,则知a>b>c=d,此时比较c和e,若e<c则c和d是中数,若e=c则c、d、e同为中数,若e>c则比较b与e(第四次),若不等,则较小者为中数,否则,同b、e同为中数。
    2. 若b=c,则比较e与c(第四次),若相等,则b、c、d、e同为中数,否则b、c、d为中数。
    3. 若b<c,则比较a与c(第四次),又三种情况:
       a)若a>c,则知a>c=d>b,此时比较e与c(第五次),若相等,则c、d、e同为中数,否则c、d为中数。
       b)若a<c,则知c=d>a>b,则比较e与c(第五次),若相等,c、d、e同为中数,若e>c,则c、d为中数,若e<c,则需比较a与e(第六次),若相等,a、e同为中数,否则较大者为中数。
       c)若a=c,则知a=c=d>b,比较e与c(第五次),若相等,a、c、d、e同为中数,否则,a、c、d为中数。三、若a=b,c=d,则比较a与c(第三次),分两种情况(a>c与a<c是类似的):
    1. 若a=c,则a=b=c=d,只需比较e与a(第四次),若相等,则全为中数(五个数全等),否则,a、b、c、d为中数。
    2. 若不相等(假定a>c),则用e分别比较两组数(ab组和cd组)即知结果。
      

  4.   

    我认为这个比较好:
    a b c d e 1. a与b 比较,一次, c d e 相互比较三次,找到它们的大小顺序  共四次了2. 那a b中的大的和c d e 中的中间数比较:
        回出现以下情况:(假设a>b,c>d>e)
         (1) a>d 则比较b与d  若b>d则为b  .  若b<d则为d
         (2) a<d 则比较a与e  若a>e则为a  .  若a<e则为e3. 这样用6次就能求出了。