home *** CD-ROM | disk | FTP | other *** search
- /*******************************************************************************
- +
- + LEDA 2.1.1 11-15-1991
- +
- +
- + _array.c
- +
- +
- + Copyright (c) 1991 by Max-Planck-Institut fuer Informatik
- + Im Stadtwald, 6600 Saarbruecken, FRG
- + All rights reserved.
- +
- *******************************************************************************/
-
-
- #include <LEDA/array.h>
-
-
- void ent_array::read(istream& in, string s)
- { cout << s;
- int i = 0;
- while (in && i<sz)
- { clear_entry(v[i]);
- read_el(v[i],in);
- i++;
- }
- }
-
- void ent_array::print(ostream& out, string s, char space) const
- { cout << s;
- int i = 0;
- while (i < sz)
- { out << chr(space);
- print_el(v[i],out);
- i++;
- }
- out.flush();
- }
-
- void ent_array::clear()
- { register int i = sz;
- register ent* vv = &v[i];
- while (i--) clear_entry(*--vv);
- }
-
- void ent_array::init()
- { register int i = sz;
- register ent* vv = &v[i];
- while (i--) init_entry(*--vv);
- }
-
-
- ent_array::ent_array(int a, int b)
- { if (a>b) error_handler(1,"bad array size");
- Low = a;
- High = b;
- sz = b-a+1;
- v = new ent[sz];
- if (v==0) error_handler(99,"array: out of memory");
- }
-
- ent_array::ent_array(int n)
- { Low = 0;
- High = n-1;
- sz = n;
- v = new ent[sz];
- if (v==0) error_handler(99,"array: out of memory");
-
- register int i = sz;
- register ent* vv = &v[i];
- while (i--) init_entry(*--vv);
- }
-
- ent_array::ent_array(ent_array& a)
- { register i = a.sz;
- sz = i;
- Low = a.Low;
- High = a.High;
- v = new ent[i];
- register ent* vv = &v[i];
- register ent* av = &a.v[i];
- while (i--) { copy_entry(*--av);
- *--vv = *av;
- }
- }
-
- ent_array& ent_array::operator=(ent_array& a)
- {
- register i = a.sz;
- if ((sz != i) || (Low != a.Low) || (High != a.High))
- error_handler(3,"different array types in assignment");
- register ent* vv = &v[i];
- register ent* av = &a.v[i];
- while (i--)
- { clear_entry(*--vv);
- copy_entry(*--av);
- *vv = *av;
- }
- return *this;
- }
-
- void ent_array::permute(int l, int r)
- {
- if (l<Low || l>High || r<l || r>High)
- error_handler(2,"array::permute illegal range");
-
- l -= Low;
- r -= Low;
-
- register ent* x;
- register ent* stop = v+r+1;
- register int j;
-
- init_random();
- for(x=v+l;x!=stop;x++)
- { j = random(l,r);
- if (x!=v+j) SWAP(*x,v[j]);
- }
- }
-
-
- void ent_array::quick_sort(register int l, register int r)
- {
- register int i = l;
- register int k = r+1;
- ent s = v[l];
-
- while (i<k)
- { while (i<r && cmp(v[++i],s)<0);
- while (k>l && cmp(v[--k],s)>0);
- if (k>i) SWAP(v[i],v[k]);
- }
-
- SWAP(v[l],v[k]);
-
- if (l < k-1) quick_sort(l,k-1);
- if (r > k+1) quick_sort(k+1,r);
- }
-
- void ent_array::quick_sort(register int l, register int r, CMP_ENT CMP)
- {
- register int i = l;
- register int k = r+1;
- ent s = v[l];
-
- while (i<k)
- { while (i<r && CMP(v[++i],s)<0);
- while (k>l && CMP(v[--k],s)>0);
- if (k>i) SWAP(v[i],v[k]);
- }
-
- SWAP(v[l],v[k]);
-
- if (l < k-1) quick_sort(l,k-1,CMP);
- if (r > k+1) quick_sort(k+1,r,CMP);
- }
-
-
- int ent_array::binary_search(ent x)
- { int l = 0;
- int r = sz-1;
- int m;
- while (l<r)
- { m = (l+r)/2;
- if (cmp(x,elem(m))==0) { l = m; break; }
- if (cmp(x,elem(m)) > 0) l = m+1;
- else
- if (cmp(x,elem(m)) < 0) r = m-1;
- }
-
- return (cmp(elem(l),x)==0) ? (l+Low) : (Low-1);
- }
-
- int ent_array::binary_search(ent x, CMP_ENT CMP)
- { int l = 0;
- int r = sz-1;
- int m;
- while (l<r)
- { m = (l+r)/2;
- if (CMP(x,elem(m))==0) { l = m; break; }
- if (CMP(x,elem(m)) > 0) l = m+1;
- else
- if (CMP(x,elem(m)) < 0) r = m-1;
- }
-
- return (CMP(elem(l),x)==0) ? (l+Low) : (Low-1);
- }
-
-
- void ent_array2::init(int a, int b, int c, int d)
- { register int i,j;
- for (i=a;i<=b;i++)
- for (j=c; j<=d; j++) init_entry(row(i)->entry(j));
- }
-
- ent_array2::ent_array2(int a, int b, int c, int d) : A(a,b)
- { Low1 = a;
- High1 = b;
- Low2 = c;
- High2 = d;
- while (b>=a) A.entry(b--) = (ent) new ent_array(c,d); }
-
- ent_array2::ent_array2(int a, int b) : A(a)
- { Low1 = 0;
- High1 = a-1;
- Low2 = 0;
- High2 = b-1;
- while (a>0) A.entry(--a) = (ent) new ent_array(b); }
-
- void ent_array2::clear()
- { register int i,j;
- for (i=Low1;i<=High1;i++)
- for (j=Low2;j<=High2;j++)
- clear_entry(row(i)->entry(j));
- }
-
- ent_array2::~ent_array2()
- { register int i;
- for (i=Low1;i<=High1;i++) delete (ent_array*)A.entry(i);
- }
-
-