_select.c
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:1k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _select.c
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #include <LEDA/basic_alg.h>
  12. #define SWAP(a,b) { help = *a; *a = *b; *b = help; }
  13. int SELECT(int* l, int* r, int pos)
  14.   // compute element at position "pos" in sequence *l,...,*r
  15.   // expected running time: O(r-l)
  16.   register int* i;
  17.   register int* k;
  18.   register int s;
  19.   register int help;
  20.   while (l < r) 
  21.   { i = l+(r-l)/2;
  22.     if (*i > *r) SWAP(i,r);
  23.     SWAP(l,i);
  24.     i = l;
  25.     k = r;
  26.     s = *l;
  27.     for(;;)
  28.     { while (*(++i) < s);
  29.       while (*(--k) > s);
  30.       if (i<k) SWAP(i,k) else break;
  31.      }
  32.   
  33.     SWAP(l,k);
  34.   
  35.     int j =  k-l+1;
  36.     if (pos <= j) 
  37.        r = k;
  38.     else 
  39.        { l = k+1;
  40.          pos -= j;
  41.         }
  42.   }
  43.   return *l;
  44. }
  45. double SELECT(double* l, double* r, int pos)
  46.   register double* i;
  47.   register double* k;
  48.   register double s;
  49.   register double help;
  50.   while (l < r) 
  51.   { i = l+(r-l)/2;
  52.     if (*i > *r) SWAP(i,r);
  53.     SWAP(l,i);
  54.     i = l;
  55.     k = r;
  56.     s = *l;
  57.     for(;;)
  58.     { while (*(++i) < s);
  59.       while (*(--k) > s);
  60.       if (i<k) SWAP(i,k) else break;
  61.      }
  62.   
  63.     SWAP(l,k);
  64.   
  65.     int j =  k-l+1;
  66.     if (pos <= j) 
  67.        r = k;
  68.     else 
  69.        { l = k+1;
  70.          pos -= j;
  71.         }
  72.   }
  73.   return *l;
  74. }