home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / diverses / leda / src / basic / _array.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-15  |  4.3 KB  |  222 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  2.1.1                                                 11-15-1991
  4. +
  5. +
  6. +  _array.c
  7. +
  8. +
  9. +  Copyright (c) 1991  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. #include <LEDA/array.h>
  16.  
  17.  
  18. void ent_array::read(istream& in, string s)
  19. { cout << s;
  20.   int i = 0; 
  21.   while (in && i<sz)
  22.   { clear_entry(v[i]);
  23.     read_el(v[i],in);
  24.     i++;
  25.    }
  26.  }
  27.  
  28. void ent_array::print(ostream& out, string s, char space) const
  29. { cout << s;
  30.   int i = 0; 
  31.   while (i < sz)
  32.     { out << chr(space);
  33.       print_el(v[i],out); 
  34.       i++;
  35.      }
  36.   out.flush();
  37. }
  38.  
  39. void ent_array::clear() 
  40. { register int i = sz;
  41.   register ent* vv = &v[i];
  42.   while (i--) clear_entry(*--vv);
  43. }
  44.  
  45. void ent_array::init() 
  46. { register int i = sz;
  47.   register ent* vv = &v[i];
  48.   while (i--) init_entry(*--vv);
  49. }
  50.  
  51.  
  52. ent_array::ent_array(int a, int b)
  53. { if (a>b) error_handler(1,"bad array size");
  54.   Low = a;
  55.   High = b;
  56.   sz = b-a+1;
  57.   v = new ent[sz];
  58.   if (v==0) error_handler(99,"array: out of memory");
  59.  }
  60.  
  61. ent_array::ent_array(int n)
  62. { Low = 0;
  63.   High = n-1;
  64.   sz = n;
  65.   v = new ent[sz];
  66.   if (v==0) error_handler(99,"array: out of memory");
  67.  
  68.   register int i = sz;
  69.   register ent* vv = &v[i];
  70.   while (i--) init_entry(*--vv);
  71. }
  72.  
  73. ent_array::ent_array(ent_array& a)
  74. {       register i = a.sz;
  75.     sz = i;    
  76.         Low = a.Low;
  77.         High = a.High;
  78.     v = new ent[i];
  79.     register ent* vv = &v[i];
  80.     register ent* av = &a.v[i];
  81.     while (i--) { copy_entry(*--av);
  82.                       *--vv = *av;
  83.                      }
  84. }
  85.  
  86. ent_array& ent_array::operator=(ent_array& a)
  87. {
  88.     register i = a.sz;
  89.     if ((sz != i) || (Low != a.Low) || (High != a.High))
  90.         error_handler(3,"different array types in assignment");
  91.     register ent* vv = &v[i];
  92.     register ent* av = &a.v[i];
  93.     while (i--) 
  94.         { clear_entry(*--vv);
  95.       copy_entry(*--av);
  96.           *vv = *av;
  97.         }
  98.     return *this;
  99. }
  100.  
  101. void ent_array::permute(int l, int r)
  102. {
  103.   if (l<Low || l>High || r<l || r>High) 
  104.          error_handler(2,"array::permute illegal range");
  105.  
  106.   l -= Low;
  107.   r -= Low;
  108.  
  109.   register ent* x;
  110.   register ent* stop = v+r+1;
  111.   register int j;
  112.  
  113.   init_random();
  114.   for(x=v+l;x!=stop;x++) 
  115.   { j = random(l,r);  
  116.     if (x!=v+j) SWAP(*x,v[j]);  
  117.    }
  118. }
  119.  
  120.  
  121. void ent_array::quick_sort(register int l, register int r)
  122.   register int i = l;
  123.   register int k = r+1;
  124.   ent s = v[l];
  125.  
  126.   while (i<k)
  127.   { while (i<r && cmp(v[++i],s)<0);
  128.     while (k>l && cmp(v[--k],s)>0);
  129.     if (k>i) SWAP(v[i],v[k]);
  130.    }
  131.  
  132.   SWAP(v[l],v[k]);
  133.  
  134.   if (l < k-1) quick_sort(l,k-1);
  135.   if (r > k+1) quick_sort(k+1,r);
  136. }
  137.  
  138. void ent_array::quick_sort(register int l, register int r, CMP_ENT CMP)
  139.   register int i = l;
  140.   register int k = r+1;
  141.   ent s = v[l];
  142.  
  143.   while (i<k)
  144.   { while (i<r && CMP(v[++i],s)<0);
  145.     while (k>l && CMP(v[--k],s)>0);
  146.     if (k>i) SWAP(v[i],v[k]);
  147.    }
  148.  
  149.   SWAP(v[l],v[k]);
  150.  
  151.   if (l < k-1) quick_sort(l,k-1,CMP);
  152.   if (r > k+1) quick_sort(k+1,r,CMP);
  153. }
  154.  
  155.  
  156. int ent_array::binary_search(ent x)
  157. { int l = 0;
  158.   int r = sz-1;
  159.   int m;
  160.   while (l<r)
  161.   { m = (l+r)/2;
  162.     if (cmp(x,elem(m))==0) { l = m; break; }
  163.     if (cmp(x,elem(m)) > 0) l = m+1;
  164.     else
  165.     if (cmp(x,elem(m)) < 0) r = m-1;
  166.    }
  167.  
  168.   return  (cmp(elem(l),x)==0) ? (l+Low) : (Low-1);
  169. }
  170.  
  171. int ent_array::binary_search(ent x, CMP_ENT CMP)
  172. { int l = 0;
  173.   int r = sz-1;
  174.   int m;
  175.   while (l<r)
  176.   { m = (l+r)/2;
  177.     if (CMP(x,elem(m))==0) { l = m; break; }
  178.     if (CMP(x,elem(m)) > 0) l = m+1;
  179.     else
  180.     if (CMP(x,elem(m)) < 0) r = m-1;
  181.    }
  182.  
  183.   return  (CMP(elem(l),x)==0) ? (l+Low) : (Low-1);
  184. }
  185.  
  186.  
  187. void ent_array2::init(int a, int b, int c, int d)
  188. { register int i,j;
  189.   for (i=a;i<=b;i++) 
  190.       for (j=c; j<=d; j++) init_entry(row(i)->entry(j));
  191. }
  192.  
  193. ent_array2::ent_array2(int a, int b, int c, int d) : A(a,b) 
  194. { Low1  = a;
  195.   High1 = b;
  196.   Low2  = c;
  197.   High2 = d;
  198.   while (b>=a) A.entry(b--) = (ent) new ent_array(c,d); }
  199.  
  200. ent_array2::ent_array2(int a, int b) : A(a) 
  201. { Low1  = 0;
  202.   High1 = a-1;
  203.   Low2  = 0;
  204.   High2 = b-1;
  205.   while (a>0) A.entry(--a) = (ent) new ent_array(b); }
  206.  
  207. void ent_array2::clear()
  208. { register int i,j;
  209.   for (i=Low1;i<=High1;i++) 
  210.   for (j=Low2;j<=High2;j++) 
  211.   clear_entry(row(i)->entry(j));
  212.  }
  213.  
  214. ent_array2::~ent_array2()
  215. { register int i;
  216.   for (i=Low1;i<=High1;i++) delete (ent_array*)A.entry(i);
  217.  }
  218.  
  219.