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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _array.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/impl/gen_array.h>
  12. #define SWAP(a,b) { GenPtr help = *a; *a = *b; *b = help; }
  13. #define MIN_D 16 
  14. void gen_array::read(istream& in, string s)
  15. { cout << s;
  16.   for (int i = 0; in && i<sz; i++) read_el(v[i],in);
  17.  }
  18. void gen_array::print(ostream& out, string s, char space) const
  19. { out << s;
  20.   for (int i=0; i<sz; i++)
  21.   { out << string("%c",space);
  22.     print_el(v[i],out); 
  23.    }
  24.   out.flush();
  25. }
  26. void gen_array::clear() 
  27. { GenPtr* p = v + sz;
  28.   while (p > v) clear_entry(*--p);
  29. }
  30. void gen_array::init() 
  31. { GenPtr* p = v + sz;
  32.   while (p > v) init_entry(*--p);
  33. }
  34. gen_array::gen_array()
  35. { Low = 0;
  36.   High = -1;
  37.   sz = 0;
  38.   v = 0;
  39.   last = 0;
  40. }
  41. gen_array::gen_array(int a, int b)
  42. { if (a>b) error_handler(1,"bad array size");
  43.   Low = a;
  44.   High = b;
  45.   sz = b-a+1;
  46.   v = new GenPtr[sz];  
  47.   if (v==0) error_handler(99,"array: out of memory");
  48.   last = v+sz-1;
  49.  }
  50. gen_array::gen_array(int n)
  51. { Low = 0;
  52.   High = n-1;
  53.   sz = n;
  54.   v = new GenPtr[sz];
  55.   if (v==0) error_handler(99,"array: out of memory");
  56.   last = v+sz-1;
  57. }
  58. gen_array::gen_array(const gen_array& a)
  59. { sz = a.sz;
  60.   Low = a.Low;
  61.   High = a.High;
  62.   v = new GenPtr[sz];
  63.   if (v==0) error_handler(99,"array: out of memory");
  64.   last = v+sz-1;
  65.   GenPtr* vv = v + sz;
  66.   GenPtr* av = a.v + sz;
  67.   while (vv > v) 
  68.   { *--vv = *--av;
  69.     a.copy_entry(*vv);
  70.    }
  71. }
  72. gen_array& gen_array::operator=(const gen_array& a)
  73. { if (this == &a) return *this;
  74.   if (sz != a.sz)
  75.   { clear();
  76.     sz = a.sz;       
  77.     delete v;
  78.     v = new GenPtr[sz];
  79.     if (v==0) error_handler(99,"array: out of memory");
  80.     last = v+sz-1;
  81.    }
  82.   Low = a.Low;
  83.   High = a.High;
  84.   GenPtr* vv = v + sz;
  85.   GenPtr* av = a.v + sz;
  86.   while (vv > v) 
  87.   { *--vv = *--av;
  88.     copy_entry(*vv);
  89.    }
  90.   return *this;
  91. }
  92. void gen_array::permute(int l, int r)
  93. {
  94.   if (l<Low || l>High || r<l || r>High) 
  95.          error_handler(2,"array::permute illegal range");
  96.  
  97.   l -= Low;
  98.   r -= Low;
  99.   GenPtr* x;
  100.   GenPtr* y;
  101.   GenPtr* stop = v+r+1;
  102.   for(x=v+l;x!=stop;x++) 
  103.   { y = v + rand_int(l,r);  
  104.     SWAP(x,y);  
  105.    }
  106. }
  107. void gen_array::sort(int l, int h) 
  108. {
  109.   GenPtr* left  = v+l-Low;
  110.   GenPtr* right = v+h-Low;
  111.   GenPtr* min_stop = left + MIN_D;
  112.   if (min_stop > right) min_stop = right;
  113.   if (int_type())
  114.     { int_quick_sort(left,right);
  115.       int_insertion_sort(left,right,min_stop);
  116.      }
  117.   else
  118.      { quick_sort(left,right);
  119.        insertion_sort(left,right,min_stop);
  120.       }
  121.  }
  122. void gen_array::quick_sort(GenPtr* l, GenPtr* r)
  123.   GenPtr* i = l+(r-l)/2; //rand_int(l,r);
  124.   GenPtr* k;
  125.   if (cmp(*i,*r) > 0) SWAP(i,r);
  126.   SWAP(l,i);
  127.   GenPtr  s = *l;
  128.   i = l;
  129.   k = r;
  130.   for(;;)
  131.   { while (cmp(*(++i),s)<0);
  132.     while (cmp(*(--k),s)>0);
  133.     if (i<k) SWAP(i,k) else break;
  134.    }
  135.   SWAP(l,k);
  136.   if (k > l+MIN_D) quick_sort(l,k-1);
  137.   if (r > k+MIN_D) quick_sort(k+1,r);
  138. }
  139. void gen_array::int_quick_sort(GenPtr* l, GenPtr* r)
  140.   GenPtr* i = l+(r-l)/2; //rand_int(l,r)
  141.   GenPtr* k;
  142.   if (LEDA_ACCESS(int,*i) > LEDA_ACCESS(int,*r)) SWAP(i,r);
  143.   SWAP(l,i);
  144.   int  s = LEDA_ACCESS(int,*l);
  145.   i = l;
  146.   k = r;
  147.   for(;;)
  148.   { while (LEDA_ACCESS(int,*(++i)) < s);
  149.     while (LEDA_ACCESS(int,*(--k)) > s);
  150.     if (i<k) SWAP(i,k) else break;
  151.    }
  152.   SWAP(l,k);
  153.   if (k > l+MIN_D) int_quick_sort(l,k-1);
  154.   if (r > k+MIN_D) int_quick_sort(k+1,r);
  155. }
  156. void gen_array::insertion_sort(GenPtr* l, GenPtr* r, GenPtr* min_stop)
  157. {
  158.   GenPtr* min=l;
  159.   GenPtr* run;
  160.   GenPtr* p;
  161.   GenPtr* q;
  162.   for (run = l+1; run <= min_stop; run++)
  163.       if (cmp(*run,*min) < 0) min = run;
  164.   SWAP(min,l);
  165.   if (r == l+1) return;
  166.   for(run=l+2; run <= r; run++)
  167.   { for (min = run-1; cmp(*run,*min) < 0; min--);
  168.     min++;
  169.     if (run != min) 
  170.     { GenPtr save = *run;
  171.       for(p=run, q = run-1; p > min; p--,q--) *p = *q;
  172.       *min = save;
  173.      }
  174.    }
  175. }
  176. void gen_array::int_insertion_sort(GenPtr* l, GenPtr* r, GenPtr* min_stop)
  177. {
  178.   GenPtr* min=l;
  179.   GenPtr* run;
  180.   GenPtr* p;
  181.   GenPtr* q;
  182.   for (run = l+1; run <= min_stop; run++)
  183.       if (LEDA_ACCESS(int,*run) <  LEDA_ACCESS(int,*min)) min = run;
  184.   SWAP(min,l);
  185.   if (r == l+1) return;
  186.   for(run=l+2; run <= r; run++)
  187.   { for (min = run-1; LEDA_ACCESS(int,*run) < LEDA_ACCESS(int,*min); min--);
  188.     min++;
  189.     if (run != min) 
  190.     { GenPtr save = *run;
  191.       for(p=run, q = run-1; p > min; p--,q--) *p = *q;
  192.       *min = save;
  193.      }
  194.    }
  195. }
  196. int gen_array::binary_search(GenPtr x)
  197. { int l = 0;
  198.   int r = sz-1;
  199.   if (int_type())
  200.     { int x_i = LEDA_ACCESS(int,x);
  201.       while (l<r)
  202.       { int m = (l+r)/2;
  203.         int m_i = LEDA_ACCESS(int,elem(m));
  204.         if (x_i == m_i) { l = m; break; }
  205.         l = (x_i > m_i) ? m+1 : m-1;
  206.        }
  207.      }
  208.   else
  209.      while (l<r)
  210.      { int m = (l+r)/2;
  211.        int c = cmp(x,elem(m));
  212.        if (c == 0) { l = m; break; }
  213.        l = (c > 0) ? m+1 : m-1;
  214.       }
  215.   return  (cmp(elem(l),x)==0) ? (l+Low) : (Low-1);
  216. }
  217. void gen_array2::init(int a, int b, int c, int d)
  218. { int i,j;
  219.   for (i=a;i<=b;i++) 
  220.       for (j=c; j<=d; j++) init_entry(row(i)->entry(j));
  221. }
  222. gen_array2::gen_array2(int a, int b, int c, int d) : A(a,b) 
  223. { Low1  = a;
  224.   High1 = b;
  225.   Low2  = c;
  226.   High2 = d;
  227.   while (b>=a) A.entry(b--) = (GenPtr) new gen_array(c,d); 
  228. }
  229. gen_array2::gen_array2(int a, int b) : A(a) 
  230. { Low1  = 0;
  231.   High1 = a-1;
  232.   Low2  = 0;
  233.   High2 = b-1;
  234.   while (a>0) A.entry(--a) = (GenPtr) new gen_array(b); 
  235. }
  236. void gen_array2::clear()
  237. { int i,j;
  238.   for (i=Low1;i<=High1;i++) 
  239.   for (j=Low2;j<=High2;j++) 
  240.   clear_entry(row(i)->entry(j));
  241. }
  242. gen_array2::~gen_array2()
  243. { for (int i=Low1;i<=High1;i++) delete (gen_array*)A.entry(i); }
  244. void gen_array2::copy_row(gen_array* from, gen_array* to) const
  245. { GenPtr* p = to->v + to->sz;
  246.   GenPtr* q = from->v + from->sz;
  247.   while (q > from->v) 
  248.   { *--p = *--q;
  249.     copy_entry(*p);
  250.    }
  251. }
  252. gen_array2::gen_array2(const gen_array2& a) : A(a.Low1,a.High1)
  253.   Low1 = a.Low1;
  254.   High1 = a.High1;
  255.   Low2 = a.Low2;
  256.   High2 = a.High2;
  257.   for(int i=Low1; i<=High1; i++)
  258.   { gen_array* p =  new gen_array(Low2,High2); 
  259.     if (p==0) error_handler(99,"array2: out of memory");
  260.     a.copy_row((gen_array*)a.A.inf(i),p);
  261.     A.entry(i) = p;
  262.    }
  263. }
  264. gen_array2& gen_array2::operator=(const gen_array2& a)
  265.   clear();
  266.   Low1 = a.Low1;
  267.   High1 = a.High1;
  268.   Low2 = a.Low2;
  269.   High2 = a.High2;
  270.   for(int i=Low1; i<=High1; i++)
  271.   { gen_array* p =  new gen_array(Low2,High2); 
  272.     if (p==0) error_handler(99,"array2: out of memory");
  273.     a.copy_row((gen_array*)a.A.inf(i),p);
  274.     A.entry(i) = p;
  275.    }
  276.   return *this;
  277. }