数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 9110|回复: 16

图算法程序下载

[复制链接]
发表于 2005-2-26 05:14:19 | 显示全部楼层 |阅读模式
<>今天发现一本好书,《C算法(第二卷 图算法)》(第三版)
[美]Robert sedgewick 著</P>
<>里面收录的算法很全</P>
<><a href="http://www.cs.princeton.edu/~rs/" target="_blank" >www.cs.princeton.edu/~rs/</A> </P>
<P>提供源代码下载 </P>
 楼主| 发表于 2005-2-26 05:17:07 | 显示全部楼层
<>想学好 <B>图算法的人应该好好学学。</B></P><><b>我上不了国外网,希望哪位好心人下载下来并共享。</b></P>
发表于 2005-2-26 16:04:00 | 显示全部楼层
<>This file contains the code from "Algorithms in C, Third Edition,
        Parts 1-4," by Robert Sedgewick, and is covered under the copyright
        and warranty notices in that book. Permission is granted for this
        code to be used for educational purposes in association with the text,
        and for other uses not covered by copyright laws, provided that
        the following notice is included with the code:</P><>                "This code is from "Algorithms in C, Third Edition,"
                by Robert Sedgewick, Addison-Wesley, 1998."</P><>        Commercial uses of this code require the explicit written
        permission of the publisher. Send your request for permission,
        stating clearly what code you would like to use, and in what
        specific way, t <a href="mailtaw.cse@aw.com" target="_blank" >aw.cse@aw.com</A></P><P>
----------
CHAPTER 1. Introduction
-----
#include &lt;stdio.h&gt;
#define N 10000
main()
  { int i, p, q, t, id[N];
    for (i = 0; i &lt; N; i++) id = i;
    while (scanf("%d %d\n", &amp;p, &amp;q) == 2)
      {
        if (id[p] == id[q]) continue;
        for (t = id[p], i = 0; i &lt; N; i++)
          if (id == t) id = id[q];
        printf(" %d %d\n", p, q);
      }
}
-----
    for (i = p; i != id; i = id) ;
    for (j = q; j != id[j]; j = id[j]) ;
    if (i == j) continue;
    id = j;
    printf(" %d %d\n", p, q);
-----
#include &lt;stdio.h&gt;
#define N 10000
main()
  { int i, j, p, q, id[N], sz[N];
    for (i = 0; i &lt; N; i++)
      { id = i; sz = 1; }
    while (scanf("%d %d\n", &amp;p, &amp;q) == 2)
      {
        for (i = p; i != id; i = id) ;
        for (j = q; j != id[j]; j = id[j]) ;
        if (i == j) continue;
        if (sz &lt; sz[j])
             { id = j; sz[j] += sz; }
        else { id[j] = i; sz += sz[j]; }
        printf(" %d %d\n", p, q);
      }
}
-----
    for (i = p; i != id; i = id)
      { int t = i; i = id[id[t]]; id[t] = i; }
    for (j = q; j != id[j]; j = id[j]) ;
      { int t = j; j = id[id[t]]; id[t] = j; } </P><P>----------
CHAPTER 2. Principles of Algorithm Analysis
-----
int search(int a[], int v, int l, int r)
  { int i;
    for (i = l; i &lt;= r; i++)
      if (v == a) return i;
    return -1;
  }
-----
int search(int a[], int v, int l, int r)
  {
    while (r &gt;= l)
      { int m = (l+r)/2;
        if (v == a[m]) return m;
        if (v &lt; a[m]) r = m-1; else l = m+1;
      }
    return -1;
  }</P><P>----------
CHAPTER 3. Elementary Data Structures
-----
#include &lt;stdio.h&gt;
int lg(int);
main()
  { int i, N;
    for (i = 1, N = 10; i &lt;= 6; i++, N *= 10)
      printf("%7d %2d %9d\n", N, lg(N), N*lg(N));
  }
int lg(int N)
  {  int i;
     for (i = 0; N &gt; 0; i++, N /= 2) ;
     return i;   
  }
-----
#include &lt;stdlib.h&gt;
typedef int numType;
numType randNum()
  { return rand(); }
main(int argc, char *argv[])
  { int i, N = atoi(argv[1]);
    float m1 = 0.0, m2 = 0.0;
    numType x;
    for (i = 0; i &lt; N; i++)
      {
        x = randNum();
        m1 += ((float) x)/N;
        m2 += ((float) x*x)/N;
      }
    printf("       Average: %f\n", m1);
    printf("Std. deviation: %f\n", sqrt(m2-m1*m1));
}
-----
typedef struct { float x; float y; } point;
float distance(point a, point b);
-----
#include &lt;math.h&gt;
#include "Point.h"
float distance(point a, point b)
  { float dx = a.x - b.x, dy = a.y - b.y;
    return sqrt(dx*dx + dy*dy);
  }
-----
#define N 10000
main()
  { int i, j, a[N];
    for (i = 2; i &lt; N; i++) a = 1;
    for (i = 2; i &lt; N; i++)
      if (a)
        for (j = i; j &lt; N/i; j++) a[i*j] = 0;
    for (i = 2; i &lt; N; i++)
      if (a) printf("%4d ", i);
    printf("\n");
  }
-----
#include &lt;stdlib.h&gt;
main(int argc, char *argv[])
  { long int i, j, N = atoi(argv[1]);
    int *a = malloc(N*sizeof(int));
    if (a == NULL)
      { printf("Insufficient memory.\n"); return; }
    ...
-----
#include &lt;stdlib.h&gt;
int heads()
  { return rand() &lt; RAND_MAX/2; }
main(int argc, char *argv[])
  { int i, j, cnt;
    int N = atoi(argv[1]), M = atoi(argv[2]);
    int *f = malloc((N+1)*sizeof(int));
    for (j = 0; j &lt;= N; j++) f[j] = 0;
    for (i = 0; i &lt; M; i++, f[cnt]++)
      for (cnt = 0, j = 0; j &lt;= N; j++)
        if (heads()) cnt++;
    for (j = 0; j &lt;= N; j++)
      {
        printf("%2d ", j);
        for (i = 0; i &lt; f[j]; i+=10) printf("*");
        printf("\n");
      }
}
-----
#include &lt;math.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include "Point.h"
float randFloat()
  { return 1.0*rand()/RAND_MAX; }
main(int argc, char *argv[])
{ float d = atof(argv[2]);
   int i, j, cnt = 0, N = atoi(argv[1]);
   point *a = malloc(N*(sizeof(*a)));
   for (i = 0; i &lt; N; i++)
     { a.x = randFloat(); a.y = randFloat(); }
   for (i = 0; i &lt; N; i++)
     for (j = i+1; j &lt; N; j++)
       if (distance(a, a[j]) &lt; d) cnt++;
   printf("%d edges shorter than %f\n", cnt, d);
}</P>
发表于 2005-2-26 16:06:12 | 显示全部楼层
<>-----
typedef struct { float Re; float Im; } Complex;
Complex COMPLEXinit(float, float);
  float Re(Complex);
  float Im(Complex);
Complex COMPLEXmult(Complex, Complex);
-----
#include "COMPLEX.h"
Complex COMPLEXinit(float Re, float Im)
  { Complex t; t.Re = Re; t.Im = Im; return t; }
float Re(Complex z)
  { return z.Re; }
float Im(Complex z)
  { return z.Im; }
Complex COMPLEXmult(Complex a, Complex b)
  { Complex t;
    t.Re = a.Re*b.Re - a.Im*b.Im;
    t.Im = a.Re*b.Im + a.Im*b.Re;
    return t;
  }
-----
typedef struct complex *Complex;
Complex COMPLEXinit(float, float);
  float Re(Complex);
  float Im(Complex);
Complex COMPLEXmult(Complex, Complex);
-----
#include &lt;stdlib.h&gt;
#include "COMPLEX.h"
struct complex { float Re; float Im; };
Complex COMPLEXinit(float Re, float Im)
  { Complex t = malloc(sizeof *t);
    t-&gt;Re = Re; t-&gt;Im = Im;
    return t;
  }
float Re(Complex z)
  { return z-&gt;Re; }
float Im(Complex z)
  { return z-&gt;Im; }
Complex COMPLEXmult(Complex a, Complex b)
  {
    return COMPLEXinit(Re(a)*Re(b) - Im(a)*Im(b),  
                       Re(a)*Im(b) + Im(a)*Re(b));
  }</P><>-----
typedef struct queue *Q;
void QUEUEdump(Q);
   Q QUEUEinit(int maxN);
int QUEUEempty(Q);
void QUEUEput(Q, Item);
Item QUEUEget(Q);
-----
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include "Item.h"
#include "QUEUE.h"
#define M 10
main(int argc, char *argv[])
  { int i, j, N = atoi(argv[1]);
    Q queues[M];
    for (i = 0; i &lt; M; i++)
      queues = QUEUEinit(N);
    for (i = 0; i &lt; N; i++)
      QUEUEput(queues[rand() % M], j);
    for (i = 0; i &lt; M; i++, printf("\n"))
      for (j = 0; !QUEUEempty(queues); j++)
        printf("%3d ", QUEUEget(queues));
  }
-----
#include &lt;stdlib.h&gt;
#include "Item.h"
#include "QUEUE.h"
typedef struct QUEUEnode* link;
struct QUEUEnode { Item item; link next; };
struct queue { link head; link tail; };
link NEW(Item item, link next)      
  { link x = malloc(sizeof *x);
    x-&gt;item = item; x-&gt;next = next;     
    return x;                        
  }                                   
Q QUEUEinit(int maxN)
  { Q q = malloc(sizeof *q);
    q-&gt;head = NULL; q-&gt;tail = NULL;
    return q;
  }
int QUEUEempty(Q q)
  { return q-&gt;head == NULL; }
void QUEUEput(Q q, Item item)
  {
    if (q-&gt;head == NULL)
      { q-&gt;tail = NEW(item, q-&gt;head)
        q-&gt;head = q-&gt;tail; return; }
    q-&gt;tail-&gt;next = NEW(item, q-&gt;tail-&gt;next);
    q-&gt;tail = q-&gt;tail-&gt;next;
  }
Item QUEUEget(Q q)
  { Item item = q-&gt;head-&gt;item;
    link t = q-&gt;head-&gt;next;
    free(q-&gt;head); q-&gt;head = t;
    return item;
  }
-----
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include "OLY.h"
main(int argc, char *argv[])
  { int N = atoi(argv[1]); float p = atof(argv[2]);
    Poly t, x; int i, j;
    printf("Binomial coefficients\n");
    t = POLYadd(POLYterm(1, 1), POLYterm(1, 0));
    for (i = 0, x = t; i &lt; N; i++)
      { x = POLYmult(t, x); showPOLY(x); }
    printf("%f\n", POLYeval(x, p));
}
-----
typedef struct poly *Poly;
void showPOLY(Poly);
Poly POLYterm(int, int);
Poly POLYadd(Poly, Poly);
Poly POLYmult(Poly, Poly);
float POLYeval(Poly, float);
-----
#include &lt;stdlib.h&gt;
#include "POLY.h"
struct poly { int N; int *a; };
Poly POLYterm(int coeff, int exp)
  { int i; Poly t = malloc(sizeof *t);
    t-&gt;a = malloc((exp+1)*sizeof(int));
    t-&gt;N = exp+1; t-&gt;a[exp] = coeff;
    for (i = 0; i &lt; exp; i++) t-&gt;a = 0;   
    return t;
  }   
Poly POLYadd(Poly p, Poly q)
  { int i; Poly t;
    if (p-&gt;N &lt; q-&gt;N) { t = p; p = q; q = t; }
    for (i = 0; i &lt; q-&gt;N; i++) p-&gt;a += q-&gt;a;
    return p;
  }
Poly POLYmult(Poly p, Poly q)
  { int i, j;
    Poly t = POLYterm(0, (p-&gt;N-1)+(q-&gt;N-1));
    for (i = 0; i &lt; p-&gt;N; i++)
      for (j = 0; j &lt; q-&gt;N; j++)
        t-&gt;a[i+j] += p-&gt;a*q-&gt;a[j];
    return t;
  }
float POLYeval(Poly p, float x)
  { int i; double t = 0.0;
    for (i = p-&gt;N-1; i &gt;= 0; i--)
      t = t*x + p-&gt;a;
    return t;
  }</P><P>----------
CHAPTER 5. Recursion and Trees
-----
int factorial(int N)
  {
    if (N == 0) return 1;
    return N*factorial(N-1);
  }  
-----
int puzzle(int N)
  {
    if (N == 1) return 1;
    if (N % 2 == 0)
         return puzzle(N/2);
    else return puzzle(3*N+1);
  }  
-----
int gcd(int m, int n)
  {
    if (n == 0) return m;
    return gcd(n, m % n);
  }  
-----
char *a; int i;
int eval()
  { int x = 0;
    while (a == ' ') i++;
    if (a == '+')
      { i++; return eval() + eval(); }
    if (a == '*')
      { i++; return eval() * eval(); }
    while ((a &gt;= '0') &amp;&amp; (a &lt;= '9'))
      x = 10*x + (a[i++]-'0');
    return x;
  }
-----
int count(link x)
  {
    if (x == NULL) return 0;
    return 1 + count(x-&gt;next);
  }
void traverse(link h, void (*visit)(link))
  {
    if (h == NULL) return;
    (*visit)(h);
    traverse(h-&gt;next, visit);
  }
void traverseR(link h, void (*visit)(link))
  {
    if (h == NULL) return;
    traverseR(h-&gt;next, visit);
    (*visit)(h);
  }
link delete(link x, Item v)
  {
    if (x == NULL) return NULL;
    if (eq(x-&gt;item, v))
      { link t = x-&gt;next; free(x); return t; }
    x-&gt;next = delete(x-&gt;next, v);
    return x;
  }
-----</P>
发表于 2005-2-26 16:06:41 | 显示全部楼层
<>
Item max(Item a[], int l, int r)
  { Item u, v; int m = (l+r)/2;
    if (l == r) return a[l];
    u = max(a, l, m);
    v = max(a, m+1, r);
    if (u &gt; v) return u; else return v;
  }
-----
void hanoi(int N, int d)
  {
    if (N == 0) return;
    hanoi(N-1, -d);
    shift(N, d);   
    hanoi(N-1, -d);
  }  
-----
rule(int l, int r, int h)
  { int m = (l+r)/2;
    if (h &gt; 0)
      {
        rule(l, m, h-1);
        mark(m, h);
        rule(m, r, h-1);
      }
  }
-----
rule(int l, int r, int h)
  {
    int i, j, t;
    for (t = 1, j = 1; t &lt;= h; j += j, t++)
      for (i = 0; l+j+i &lt;= r; i += j+j)
        mark(l+j+i, t);
  }
-----
int F(int i)
  {
    if (i &lt; 1) return 0;
    if (i == 1) return 1;
    return F(i-1) + F(i-2);
  }
-----
int F(int i)
  { int t;
    if (knownF != unknown) return knownF;
    if (i == 0) t = 0;
    if (i == 1) t = 1;
    if (i &gt; 1) t = F(i-1) + F(i-2);
    return knownF = t;
  }
-----
int knap(int cap)
  { int i, space, max, t;
    for (i = 0, max = 0; i &lt; N; i++)
      if ((space = cap-items.size) &gt;= 0)
        if ((t = knap(space) + items.val) &gt; max)
          max = t;
    return max;     
  }
-----
int knap(int M)
  { int i, space, max, maxi, t;
    if (maxKnown[M] != unknown) return maxKnown[M];
    for (i = 0, max = 0; i &lt; N; i++)
      if ((space = M-items.size) &gt;= 0)
        if ((t = knap(space) + items.val) &gt; max)
          { max = t; maxi = i; }
    maxKnown[M] = max; itemKnown[M] = items[maxi];
    return max;     
  }
-----
void traverse(link h, void (*visit)(link))
  {
    if (h == NULL) return;
    (*visit)(h);
    traverse(h-&gt;l, visit);
    traverse(h-&gt;r, visit);
  }
-----
void traverse(link h, void (*visit)(link))
  {
    STACKinit(max); STACKpush(h);
    while (!STACKempty())
      {
        (*visit)(h = STACKpop());
        if (h-&gt;r != NULL) STACKpush(h-&gt;r);
        if (h-&gt;l != NULL) STACKpush(h-&gt;l);
      }
  }
-----
void traverse(link h, void (*visit)(link))
  {
    QUEUEinit(max); QUEUEput(h);
    while (!QUEUEempty())
      {
        (*visit)(h = QUEUEget());
        if (h-&gt;l != NULL) QUEUEput(h-&gt;l);
        if (h-&gt;r != NULL) QUEUEput(h-&gt;r);
      }
  }
-----
int count(link h)
  {
    if (h == NULL) return 0;
    return count(h-&gt;l) + count(h-&gt;r) + 1;
  }
int height(link h)
  { int u, v;
    if (h == NULL) return -1;
    u = height(h-&gt;l); v = height(h-&gt;r);
    if (u &gt; v) return u+1; else return v+1;
  }
-----</P><>void printnode(char c, int h)
  { int i;
    for (i = 0; i &lt; h; i++) printf("  ");
    printf("%c\n", c);
  }
void show(link x, int h)
  {
    if (x == NULL) { printnode("*", h); return; }
    show(x-&gt;r, h+1);   
    printnode(x-&gt;item, h);
    show(x-&gt;l, h+1);   
  }
-----
typedef struct node *link;
struct node { Item item; link l, r };
link NEW(Item item, link l, link r)
  { link x = malloc(sizeof *x);
    x-&gt;item = item; x-&gt;l = l; x-&gt;r = r;
    return x;
  }
link max(Item a[], int l, int r)
  { int m = (l+r)/2; Item u, v;
    link x = NEW(a[m], NULL, NULL);
    if (l == r) return x;
    x-&gt;l = max(a, l, m);
    x-&gt;r = max(a, m+1, r);
    u = x-&gt;l-&gt;item; v = x-&gt;r-&gt;item;
    if (u &gt; v)
      x-&gt;item = u; else x-&gt;item = v;
    return x;
  }
-----
char *a; int i;
typedef struct Tnode* link;
struct Tnode { char token; link l, r; };
link NEW(char token, link l, link r)
  { link x = malloc(sizeof *x);
    x-&gt;token = token; x-&gt;l = l; x-&gt;r = r;
    return x;
  }
link parse()
  { char t = a[i++];
    link x = NEW(t, NULL, NULL);
    if ((t == '+') || (t == '*'))
      { x-&gt;l = parse(); x-&gt;r = parse(); }
    return x;
  }
-----
void traverse(int k, void (*visit)(int))
  { link t;
    (*visit)(k); visited[k] = 1;
    for (t = adj[k]; t != NULL; t = t-&gt;next)
      if (!visited[t-&gt;v]) traverse(t-&gt;v, visit);
  }
-----
void traverse(int k, void (*visit)(int))
  { link t;
    QUEUEinit(V); QUEUEput(k);
    while (!QUEUEempty())
      if (visited[k = QUEUEget()] == 0)
        {
          (*visit)(k); visited[k] = 1;
          for (t = adj[k]; t != NULL; t = t-&gt;next)
            if (visited[t-&gt;v] == 0) QUEUEput(t-&gt;v);
        }
  }
-----</P><>----------
CHAPTER 6. Elementary Sorting Methods
-----
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
typedef int Item;
#define key(A) (A)
#define less(A, B) (key(A) &lt; key(B))
#define exch(A, B) { Item t = A; A = B; B = t; }
#define compexch(A, B) if (less(B, A)) exch(A, B)
void sort(Item a[], int l, int r)
  { int i, j;
    for (i = l+1; i &lt;= r; i++)
      for (j = i; j &gt; l; j--)
        compexch(a[j-1], a[j]);
  }
main(int argc, char *argv[])
  { int i, N = atoi(argv[1]), sw = atoi(argv[2]);
    int *a = malloc(N*sizeof(int));
    if (sw)
      for (i = 0; i &lt; N; i++)
        a = 1000*(1.0*rand()/RAND_MAX);
    else
      while (scanf("%d", &amp;a[N]) == 1) N++;
    sort(a, 0, N-1);
    for (i = 0; i &lt; N; i++) printf("%3d ", a);
    printf("\n");
  }
-----
void selection(Item a[], int l, int r)
  { int i, j;
    for (i = l; i &lt; r; i++)
      { int min = i;
        for (j = i+1; j &lt;= r; j++)
            if (less(a[j], a[min])) min = j;
        exch(a, a[min]);
      }
  }
-----
void insertion(Item a[], int l, int r)
  { int i;
    for (i = l+1; i &lt;= r; i++) compexch(a[l], a);
    for (i = l+2; i &lt;= r; i++)
      { int j = i; Item v = a;
        while (less(v, a[j-1]))
          { a[j] = a[j-1]; j--; }
        a[j] = v;
      }
  }
-----
void bubble(Item a[], int l, int r)
  { int i, j;
    for (i = l; i &lt; r; i++)
      for (j = r; j &gt; i; j--)
        compexch(a[j-1], a[j]);
  }
-----
void shellsort(Item a[], int l, int r)
  { int i, j, h;
    for (h = 1; h &lt;= (r-l)/9; h = 3*h+1) ;
    for ( ; h &gt; 0; h /= 3)
      for (i = l+h; i &lt;= r; i++)
        { int j = i; Item v = a;
          while (j &gt;= l+h &amp;&amp; less(v, a[j-h]))
            { a[j] = a[j-h]; j -= h; }
          a[j] = v;
        }
  }
-----
#include &lt;stdlib.h&gt;
#include "Item.h"
#include "Array.h"
main(int argc, char *argv[])
  { int i, N = atoi(argv[1]), sw = atoi(argv[2]);
    Item *a = malloc(N*sizeof(Item));
    if (sw) randinit(a, N); else scaninit(a, &amp;N);
    sort(a, 0, N-1);
    show(a, 0, N-1);
  }
-----
void randinit(Item [], int);
void scaninit(Item [], int *);
void show(Item [], int, int);
void sort(Item [], int, int);
-----
#include &lt;stdio.h&gt;                  
#include &lt;stdlib.h&gt;                  
#include "Item.h"
#include "Array.h"
void randinit(Item a[], int N)
  { int i;
    for (i = 0; i &lt; N; i++) a = ITEMrand();
  }
void scaninit(Item a[], int *N)
  { int i = 0;
    for (i = 0; i &lt; *N; i++)
      if (ITEMscan(&amp;a) == EOF) break;
    *N = i;
  }
void show(itemType a[], int l, int r)
  { int i;
    for (i = l; i &lt;= r; i++) ITEMshow(a);
    printf("\n");
  }  
-----
typedef double Item;
#define key(A) (A)
#define less(A, B) (key(A) &lt; key(B))
#define exch(A, B) { Item t = A; A = B; B = t; }
#define compexch(A, B) if (less(B, A)) exch(A, B)
Item ITEMrand(void);
int ITEMscan(Item *);
void ITEMshow(Item);
-----
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include "Item.h"
double ITEMrand(void)
         { return 1.0*rand()/RAND_MAX; }  
   int ITEMscan(double *x)
         { return scanf("%f", x); }  
  void ITEMshow(double x)
         { printf("%7.5f ", x); }  
-----
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;
#include "Item.h"
static char buf[100000];
static int cnt = 0;
int ITEMscan(char **x)
  { int t;
    *x = &amp;buf[cnt];
    t = scanf("%s", *x); cnt += strlen(*x)+1;
    return t;
  }  
void ITEMshow(char *x)
  { printf("%s ", x); }  
-----
struct record { char name[30]; int num; };
typedef struct record* Item;
#define exch(A, B) { Item t = A; A = B; B = t; }
#define compexch(A, B) if (less(B, A)) exch(A, B);
int less(Item, Item);
Item ITEMrand();
int ITEMscan(Item *);
void ITEMshow(Item);</P><P>-----
struct record data[maxN];
int Nrecs = 0;
int ITEMscan(struct record **x)
  {
    *x = &amp;data[Nrecs];
    return scanf("%30s %d\n",
             data[Nrecs].name, &amp;data[Nrecs++].num);
  }
void ITEMshow(struct record *x)
  { printf("%3d %-30s\n", x-&gt;num, x-&gt;name); }  
-----
insitu(dataType data[], int a[], int N)
  { int i, j, k;
    for (i = 0; i &lt; N; i++)
      { dataType v = data;
        for (k = i; a[k] != i; k = a[j], a[j] = j)
          { j = k; data[k] = data[a[k]]; }
        data[k] = v; a[k] = k;
      }
  }  
-----
typedef struct node *link;
struct node { Item item;  link next; };
link NEW(Item, link);
link init(int);
void show(link);
link sort(link);</P>
发表于 2005-2-26 16:07:08 | 显示全部楼层
<>
-----
link listselection(link h)
  { link max, t, out = NULL;
    while (h-&gt;next != NULL)
      {
        max = findmax(h);
        t = max-&gt;next; max-&gt;next = t-&gt;next;
        t-&gt;next = out; out = t;
      }
    h-&gt;next = out;
    return(h);
  }
-----
void distcount(int a[], int l, int r)
  { int i, j, cnt[M];
    int b[maxN];
    for (j = 0; j &lt;  M; j++) cnt[j] = 0;
    for (i = l; i &lt;= r; i++) cnt[a+1]++;
    for (j = 1; j &lt;  M; j++) cnt[j] += cnt[j-1];
    for (i = l; i &lt;= r; i++) b[cnt[a]++] = a;
    for (i = l; i &lt;= r; i++) a = b;
  }
-----
void insertion(itemType a[], int l, int r)
  { int i, j;
    for (i = l+1; i &lt;= r; i++)
      for (j = i; j &gt; l; j--)
        if (less(a[j-1], a[j])) break;
        else exch(a[j-1], a[j]);
  }</P><>
----------
CHAPTER 7. Quicksort
-----
int partition(Item a[], int l, int r);
void quicksort(Item a[], int l, int r)
  { int i;
    if (r &lt;= l) return;
    i = partition(a, l, r);
    quicksort(a, l, i-1);
    quicksort(a, i+1, r);
  }
-----
int partition(Item a[], int l, int r)
  { int i = l-1, j = r; Item v = a[r];
    for (;;)
      {
        while (less(a[++i], v)) ;
        while (less(v, a[--j])) if (j == l) break;
        if (i &gt;= j) break;
        exch(a, a[j]);
      }
    exch(a, a[r]);
    return i;
  }
-----
#define push2(A, B)  push(B); push(A);
void quicksort(Item a[], int l, int r)
  { int i;
    stackinit(); push2(l, r);
    while (!stackempty())
      {
        l = pop(); r = pop();
        if (r &lt;= l) continue;
        i = partition(a, l, r);
        if (i-l &gt; r-i)
          { push2(l, i-1); push2(i+1, r); }
        else
          { push2(i+1, r); push2(l, i-1); }
      }
  }
-----
#define M 10
void quicksort(Item a[], int l, int r)
  { int i;
    if (r-l &lt;= M) return;
    exch(a[(l+r)/2], a[r-1]);
    compexch(a[l], a[r-1]);
      compexch(a[l], a[r]);
        compexch(a[r-1], a[r]);
    i = partition(a, l+1, r-1);
    quicksort(a, l, i-1);
    quicksort(a, i+1, r);
  }
void sort(Item a[], int l, int r)
  {
    quicksort(a, l, r);
    insertion(a, l, r);
  }
-----
#define eq(A, B) (!less(A, B) &amp;&amp; !less(B, A))
void quicksort(Item a[], int l, int r)
  { int i, j, k, p, q; Item v;
    if (r &lt;= l) return;
    v = a[r]; i = l-1; j = r; p = l-1; q = r;
    for (;;)
      {
        while (less(a[++i], v)) ;
        while (less(v, a[--j])) if (j == l) break;
        if (i &gt;= j) break;
        exch(a, a[j]);
        if (eq(a, v)) { p++; exch(a[p], a); }
        if (eq(v, a[j])) { q--; exch(a[q], a[j]); }
      }
    exch(a, a[r]); j = i-1; i = i+1;
    for (k = l  ; k &lt; p; k++, j--) exch(a[k], a[j]);
    for (k = r-1; k &gt; q; k--, i++) exch(a[k], a);
    quicksort(a, l, j);
    quicksort(a, i, r);
  }
-----
select(Item a[], int l, int r, int k)
  { int i;
    if (r &lt;= l) return;
    i = partition(a, l, r);
    if (i &gt; k) select(a, l, i-1, k);
    if (i &lt; k) select(a, i+1, r, k);
  }
-----
select(Item a[], int l, int r, int k)
  {
    while (r &gt; l)
      { int i = partition(a, l, r);
        if (i &gt;= k) r = i-1;
        if (i &lt;= k) l = i+1;
      }
  }</P><>----------
CHAPTER 8. Mergesort
-----
mergeAB(Item c[], Item a[], int N, Item b[], int M )
  { int i, j, k;
    for (i = 0, j = 0, k = 0; k &lt; N+M; k++)
      {
        if (i == N) { c[k] = b[j++]; continue; }
        if (j == M) { c[k] = a[i++]; continue; }
        c[k] = (less(a, b[j])) ? a[i++] : b[j++];
      }
  }
-----
Item aux[maxN];
merge(Item a[], int l, int m, int r)
  { int i, j, k;
    for (i = m+1; i &gt; l; i--) aux[i-1] = a[i-1];
    for (j = m; j &lt; r; j++) aux[r+m-j] = a[j+1];
    for (k = l; k &lt;= r; k++)
       if (less(aux, aux[j]))
          a[k] = aux[i++]; else a[k] = aux[j--];
  }
-----
void mergesort(Item a[], int l, int r)
  { int m = (r+l)/2;
    if (r &lt;= l) return;
    mergesort(a, l, m);  
    mergesort(a, m+1, r);
    merge(a, l, m, r);
  }
-----
#define maxN 10000
Item aux[maxN];
void mergesortABr(Item a[], Item b[], int l, int r)
  { int m = (l+r)/2;
    if (r-l &lt;= 10) { insertion(a, l, r); return; }
    mergesortABr(b, a, l, m);  
    mergesortABr(b, a, m+1, r);
    mergeAB(a+l, b+l, m-l+1, b+m+1, r-m);
  }
void mergesortAB(Item a[], int l, int r)
  { int i;
    for (i = l; i &lt;= r; i++) aux = a;
    mergesortABr(a, aux, l, r);
  }
-----
#define min(A, B) (A &lt; B) ? A : B
void mergesortBU(Item a[], int l, int r)
  { int i, m;
    for (m = 1; m &lt; r-l; m = m+m)
      for (i = l; i &lt;= r-m; i += m+m)
        merge(a, i, i+m-1, min(i+m+m-1, r));
  }
-----
link merge(link a, link b)
  { struct node head; link c = &amp;head;
    while ((a != NULL) &amp;&amp; (b != NULL))
      if (less(a-&gt;item, b-&gt;item))
        { c-&gt;next = a; c = a; a = a-&gt;next; }
      else
        { c-&gt;next = b; c = b; b = b-&gt;next; }
    c-&gt;next = (a == NULL) ? b : a;
    return head.next;
  }
-----
link merge(link a, link b);
link mergesort(link c)
  { link a, b;
    if (c-&gt;next == NULL) return c;
    a = c; b = c-&gt;next;
    while ((b != NULL) &amp;&amp; (b-&gt;next != NULL))
      { c = c-&gt;next; b = b-&gt;next-&gt;next; }
    b = c-&gt;next; c-&gt;next = NULL;
    return merge(mergesort(a), mergesort(b));
  }
-----
link mergesort(link t)
  { link u;
    for (Qinit(); t != NULL; t = u)
      { u = t-&gt;next; t-&gt;next = NULL; Qput(t); }
    t = Qget();     
    while (!Qempty())
      { Qput(t); t = merge(Qget(), Qget()); }
    return t;
  }</P><P>----------
CHAPTER 9. Priority Queues and Heapsort
-----
void PQinit(int);
int PQempty();
void PQinsert(Item);
Item PQdelmax();
-----
#include &lt;stdlib.h&gt;
#include "Item.h"   
static Item *pq;
static int N;
void PQinit(int maxN)
  { pq = malloc(maxN*sizeof(Item)); N = 0; }
int PQempty()
  { return N == 0; }
void PQinsert(Item v)
  { pq[N++] = v; }
Item PQdelmax()
  { int j, max = 0;
    for (j = 1; j &lt; N; j++)
      if (less(pq[max], pq[j])) max = j;
    exch(pq[max], pq[N-1]);  
    return pq[--N];
  }
-----
fixUp(Item a[], int k)
  {
    while (k &gt; 1 &amp;&amp; less(a[k/2], a[k]))
      { exch(a[k], a[k/2]); k = k/2; }
  }
-----
fixDown(Item a[], int k, int N)
  { int j;
    while (2*k &lt;= N)
      { j = 2*k;
        if (j &lt; N &amp;&amp; less(a[j], a[j+1])) j++;
        if (!less(a[k], a[j])) break;
        exch(a[k], a[j]); k = j;
      }
  }
-----
#include &lt;stdlib.h&gt;
#include "Item.h"   
static Item *pq;
static int N;
void PQinit(int maxN)
  { pq = malloc((maxN+1)*sizeof(Item)); N = 0; }
int PQempty()
  { return N == 0; }
void PQinsert(Item v)
  { pq[++N] = v; fixUp(pq, N); }
Item PQdelmax()
  {
    exch(pq[1], pq[N]);
    fixDown(pq, 1, N-1);
    return pq[N--];
  }
-----
void PQsort(Item a[], int l, int r)
  { int k;
    PQinit();
    for (k = l; k &lt;= r; k++) PQinsert(a[k]);
    for (k = r; k &gt;= l; k--) a[k] = PQdelmax();
  }
-----
#define pq(A) a[l-1+A]
void heapsort(Item a[], int l, int r)
  { int k, N = r-l+1;
    for (k = N/2; k &gt;= 1; k--)
      fixDown(&amp;pq(0), k, N);
    while (N &gt; 1)
      { exch(pq(1), pq(N));
        fixDown(&amp;pq(0), 1, --N); }
  }
-----
typedef struct pq* PQ;
typedef struct PQnode* PQlink;
    PQ PQinit();
   int PQempty(PQ);
PQlink PQinsert(PQ, Item);
  Item PQdelmax(PQ);
  void PQchange(PQ, PQlink, Item);
  void PQdelete(PQ, PQlink);
  void PQjoin(PQ, PQ);
-----
#include &lt;stdlib.h&gt;
#include "Item.h"
#include "PQfull.h"
struct PQnode { Item key; PQlink prev, next; };
struct pq { PQlink head, tail; };
PQ PQinit()
  { PQ pq = malloc(sizeof *pq);
    PQlink h = malloc(sizeof *h),
           t = malloc(sizeof *t);
    h-&gt;prev = t; h-&gt;next = t;
    t-&gt;prev = h; t-&gt;next = h;
    pq-&gt;head = h; pq-&gt;tail = t;
    return pq;
  }
int PQempty(PQ pq)
  { return pq-&gt;head-&gt;next-&gt;next == pq-&gt;head; }
PQlink PQinsert(PQ pq, Item v)
  { PQlink t = malloc(sizeof *t);
    t-&gt;key = v;
    t-&gt;next = pq-&gt;head-&gt;next; t-&gt;next-&gt;prev = t;
    t-&gt;prev = pq-&gt;head; pq-&gt;head-&gt;next = t;
  }
Item PQdelmax(PQ pq)
  { Item max; struct PQnode *t, *x = pq-&gt;head-&gt;next;
    for (t = x; t-&gt;next != pq-&gt;head; t = t-&gt;next)
      if (t-&gt;key &gt; x-&gt;key) x = t;
    max = x-&gt;key;
    x-&gt;next-&gt;prev = x-&gt;prev;
    x-&gt;prev-&gt;next = x-&gt;next;
    free(x); return max;
  }
-----</P>
发表于 2005-2-26 16:07:37 | 显示全部楼层
<>
void PQchange(PQ pq, PQlink x, Item v)
  { x-&gt;key = v; }  
void PQdelete(PQ pq, PQlink x)
  { PQlink t;
    t-&gt;next-&gt;prev = t-&gt;prev;
    t-&gt;prev-&gt;next = t-&gt;next;
    free(t);
  }  
void PQjoin(PQ a, PQ b)
  { PQlink atail, bhead;
    a-&gt;tail-&gt;prev-&gt;next = b-&gt;head-&gt;next;
    b-&gt;head-&gt;next-&gt;prev = a-&gt;tail-&gt;prev;
    a-&gt;head-&gt;prev = b-&gt;tail;
    b-&gt;tail-&gt;next = a-&gt;head;
    free(a-&gt;tail); free(b-&gt;head);
  }
-----
int less(int, int);
void PQinit();
int PQempty();
void PQinsert(int);
int PQdelmax();
void PQchange(int);
void PQdelete(int);
-----
#include "Qindex.h"
typedef int Item;
static int N, pq[maxPQ+1], qp[maxPQ+1];
void exch(int i, int j)
  { int t;
    t = i; i = j; j = t;
    t = qp; qp = qp[j]; qp[j] = t;
  }
void PQinit() { N = 0; }
int PQempty() { return !N; }
void PQinsert(int k)
  { qp[k] = ++N; pq[N] = k; fixUp(pq, N); }
int PQdelmax()
  {
    exch(pq[1], pq[N]);
    fixDown(pq, 1, --N);
    return pq[N+1];
  }
void PQchange(int k)
  { fixUp(pq, qp[k]); fixDown(pq, qp[k], N); }
-----
PQlink pair(PQlink p, PQlink q)
  { PQlink t;
    if (less(p-&gt;key, q-&gt;key))
         { p-&gt;r = q-&gt;l; q-&gt;l = p; return q; }
    else { q-&gt;r = p-&gt;l; p-&gt;l = q; return p; }
  }
-----
PQlink PQinsert(PQ pq, Item v)
  { int i;
    PQlink c, t = malloc(sizeof *t);
    c = t; c-&gt;l = z; c-&gt;r = z; c-&gt;key = v;
    for (i = 0; i &lt; maxBQsize; i++)
      {
        if (c == z) break;
        if (pq-&gt;bq == z) { pq-&gt;bq = c; break; }
        c = pair(c, pq-&gt;bq); pq-&gt;bq = z;
      }
    return t;
  }
-----
Item PQdelmax(PQ pq)
  { int i, j, max; PQlink x; Item v;
    PQlink temp[maxBQsize];
    for (i = 0, max = -1; i &lt; maxBQsize; i++)
      if (pq-&gt;bq != z)
        if ((max == -1) || (pq-&gt;bq-&gt;key &gt; v))
          { max = i; v = pq-&gt;bq[max]-&gt;key; }
    x = pq-&gt;bq[max]-&gt;l;
    for (i = max; i &lt; maxBQsize; i++) temp = z;
    for (i = max ; i &gt; 0; i--)
      { temp[i-1] = x; x = x-&gt;r; temp[i-1]-&gt;r = z; }
    free(pq-&gt;bq[max]); pq-&gt;bq[max] = z;
    BQjoin(pq-&gt;bq, temp);  
    return v;
  }      
-----
#define test(C, B, A) 4*(C) + 2*(B) + 1*(A)
void BQjoin(PQlink *a, PQlink *b)
  { int i; PQlink c = z;
    for (i = 0; i &lt; maxBQsize; i++)
      switch(test(c != z, b != z, a != z))
        {
          case 2: a = b; break;
          case 3: c = pair(a, b);
                  a = z; break;
          case 4: a = c; c = z; break;
          case 5: c = pair(c, a);
                  a = z; break;
          case 6:
          case 7: c = pair(c, b); break;
        }
  }
void PQjoin(PQ a, PQ b)
  { BQjoin(a-&gt;bq, b-&gt;bq); }</P><>----------
CHAPTER 10. Radix Sorting
-----
quicksortB(int a[], int l, int r, int w)
  { int i = l, j = r;
    if (r &lt;= l || w &gt; bitsword) return;
    while (j != i)
      {
        while (digit(a, w) == 0 &amp;&amp; (i &lt; j)) i++;
        while (digit(a[j], w) == 1 &amp;&amp; (j &gt; i)) j--;
        exch(a, a[j]);
      }
    if (digit(a[r], w) == 0) j++;
    quicksortB(a, l, j-1, w+1);
    quicksortB(a, j, r, w+1);
  }
void sort(Item a[], int l, int r)
  {
    quicksortB(a, l, r, 0);
  }
-----
#define bin(A) l+count[A]
void radixMSD(Item a[], int l, int r, int w)
  { int i, j, count[R+1];
    if (w &gt; bytesword) return;
    if (r-l &lt;= M) { insertion(a, l, r); return; }
    for (j = 0; j &lt; R; j++) count[j] = 0;
    for (i = l; i &lt;= r; i++)
      count[digit(a, w) + 1]++;
    for (j = 1; j &lt; R; j++)
      count[j] += count[j-1];
    for (i = l; i &lt;= r; i++)
      aux[l+count[digit(a, w)]++] = a;
    for (i = l; i &lt;= r; i++) a = aux;
    radixMSD(a, l, bin(0)-1, w+1);
    for (j = 0; j &lt; R-1; j++)
      radixMSD(a, bin(j), bin(j+1)-1, w+1);
  }
-----
#define ch(A) digit(A, D)
void quicksortX(Item a[], int l, int r, int D)
  {
    int i, j, k, p, q; int v;
    if (r-l &lt;= M) { insertion(a, l, r); return; }
    v = ch(a[r]); i = l-1; j = r; p = l-1; q = r;
    while (i &lt; j)
      {
        while (ch(a[++i]) &lt; v) ;
        while (v &lt; ch(a[--j])) if (j == l) break;
        if (i &gt; j) break;
        exch(a, a[j]);
        if (ch(a)==v) { p++; exch(a[p], a); }
        if (v==ch(a[j])) { q--; exch(a[j], a[q]); }
      }
    if (p == q)
      { if (v != '\0') quicksortX(a, l, r, D+1);
        return; }
    if (ch(a) &lt; v) i++;
    for (k = l; k &lt;= p; k++, j--) exch(a[k], a[j]);
    for (k = r; k &gt;= q; k--, i++) exch(a[k], a);
    quicksortX(a, l, j, D);
    if ((i == r) &amp;&amp; (ch(a) == v)) i++;
    if (v != '\0') quicksortX(a, j+1, i-1, D+1);
    quicksortX(a, i, r, D);
  }
-----
void radixLSD(Item a[], int l, int r)
  {
    int i, j, w, count[R+1];
    for (w = bytesword-1; w &gt;= 0; w--)
      {
        for (j = 0; j &lt; R; j++) count[j] = 0;
        for (i = l; i &lt;= r; i++)
          count[digit(a, w) + 1]++;
        for (j = 1; j &lt; R; j++)
          count[j] += count[j-1];
        for (i = l; i &lt;= r; i++)
          aux[count[digit(a, w)]++] = a;
        for (i = l; i &lt;= r; i++) a = aux;
      }
  } </P><P>----------
CHAPTER 11. Special-Purpose Sorts
-----
shuffle(itemType a[], int l, int r)
  { int i, j, m = (l+r)/2;
    for (i = l, j = 0; i &lt;= r; i+=2, j++)
      { aux = a[l+j]; aux[i+1] = a[m+1+j]; }
    for (i = l; i &lt;= r; i++) a = aux;
  }
unshuffle(itemType a[], int l, int r)
  { int i, j, m = (l+r)/2;
    for (i = l, j = 0; i &lt;= r; i+=2, j++)
      { aux[l+j] = a; aux[m+1+j] = a[i+1]; }
    for (i = l; i &lt;= r; i++) a = aux;
  }
-----
mergeTD(itemType a[], int l, int r)
  { int i, m = (l+r)/2;
    if (r == l+1) compexch(a[l], a[r]);
    if (r &lt; l+2) return;
    unshuffle(a, l, r);
    mergeTD(a, l, m);
    mergeTD(a, m+1, r);
    shuffle(a, l, r);
    for (i = l+1; i &lt; r; i+=2)
      compexch(a, a[i+1]);
  }
-----
mergeBU(itemType a[], int l, int r)
  { int i, j, k, N = r-l+1;
    for (k = N/2; k &gt; 0; k /= 2)
      for (j = k % (N/2); j+k &lt; N; j += (k+k))
        for (i = 0; i &lt; k; i++)
          compexch(a[l+j+i], a[l+j+i+k]);
  }
-----
void batchersort(itemType a[], int l, int r)
  { int i, j, k, p, N = r-l+1;
    for (p = 1; p &lt; N; p += p)
      for (k = p; k &gt; 0; k /= 2)
        for (j = k%p; j+k &lt; N; j += (k+k))
          for (i = 0; i &lt; k; i++)
            if (j+i+k &lt; N)
              if ((j+i)/(p+p) == (j+i+k)/(p+p))
                compexch(a[l+j+i], a[l+j+i+k]);
  }
-----
id = 1;
for (i = 1; i &lt;= S; i++) a = strGet(0);
while (a[1] &lt; z)
  {
    strPut(id, (c = a[1]));
    if ((a[1] = strGet(0)) &lt; c) mark(a[1]);
    fixDown(1, S);
    if (marked(a[1]))
      {
        for (i = 1; i &lt;= S; i++) unmark(a);
        strPut(id, z);
        id = id % S + 1;
      }
  }
strPut(id, z);
-----
void compexch(int x, int y)
  { int t;
    t = stage[a[x]]; if (t &lt; stage[a[y]]) t = stage[a[y]]; t++;
    stage[a[x]] = t; stage[a[y]] = t;
    printf("%3d %3d %3d\n", t, a[x], a[y]);
  }</P><P>----------
CHAPTER 12. Symbol Tables and BSTs
-----
void STinit(int);
int STcount();
void STinsert(Item);
Item STsearch(Key);
void STdelete(Item);
Item STselect(int);
void STsort(void (*visit)(Item));
-----
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include "Item.h"
#include "ST.h"
void main(int argc, char *argv[])
{ int N, maxN = atoi(argv[1]), sw = atoi(argv[2]);
    Key v; Item item;
    STinit(maxN);
    for (N = 0; N &lt; maxN; N++)
      {
        if (sw) v = ITEMrand();
          else if (ITEMscan(&amp;v) == EOF) break;
        if (STsearch(v) != NULLitem) continue;
        key(item) = v;
        STinsert(item);
      }
    STsort(ITEMshow); printf("\n");
    printf("%d keys ", N);
    printf("%d distinct keys\n", STcount());
}
-----
static Item *st;
static int M = maxKey;
void STinit(int maxN)
  { int i;
    st = malloc((M+1)*sizeof(Item));
    for (i = 0; i &lt;= M; i++) st = NULLitem;
  }
int STcount()
  { int i, N = 0;
    for (i = 0; i &lt; M; i++)
      if (st != NULLitem) N++;
    return N;
  }
void STinsert(Item item)
  { st[key(item)] = item; }
Item STsearch(Key v)
  { return st[v]; }
void STdelete(Item item)
  { st[key(item)] = NULLitem; }
Item STselect(int k)
  { int i;
    for (i = 0; i &lt; M; i++)
      if (st != NULLitem)
        if (k-- == 0) return st;
  }
void STsort(void (*visit)(Item))
  { int i;
    for (i = 0; i &lt; M; i++)
      if (st != NULLitem) visit(st);
  }
-----
static Item *st;
static int N;
void STinit(int maxN)
  { st = malloc((maxN)*sizeof(Item)); N = 0; }
int STcount()
  { return N; }
void STinsert(Item item)
  { int j = N++; Key v = key(item);
    while (j&gt;0 &amp;&amp; less(v, key(st[j-1])))
      {  st[j] = st[j-1]; j--; }
    st[j] = item;
  }
Item STsearch(Key v)
  { int j;
    for (j = 0; j &lt; N; j++)
      {
        if (eq(v, key(st[j]))) return st[j];
        if (less(v, key(st[j]))) break;
      }
    return NULLitem;
  }
Item STselect(int k)
  { return st[k]; }
void STsort(void (*visit)(Item))
  { int i;
    for (i = 0; i &lt; N; i++) visit(st);
  }
-----
typedef struct STnode* link;
struct STnode { Item item; link next; };
static link head, z;
static int N;
static link NEW(Item item, link next)      
  { link x = malloc(sizeof *x);
    x-&gt;item = item; x-&gt;next = next;     
    return x;                        
  }                                   
void STinit(int max)
  { N = 0; head = (z = NEW(NULLitem, NULL)); }
int STcount() { return N; }
Item searchR(link t, Key v)
  {
    if (t == z) return NULLitem;
    if (eq(key(t-&gt;item), v)) return t-&gt;item;
    return searchR(t-&gt;next, v);
  }
Item STsearch(Key v)
  { return searchR(head, v); }
void STinsert(Item item)
  { head = NEW(item, head); N++; }
-----
Item search(int l, int r, Key v)
  { int m = (l+r)/2;
    if (l &gt; r) return NULLitem;
    if eq(v, key(st[m])) return st[m];
    if (l == r) return NULLitem;
    if less(v, key(st[m]))
         return search(l, m-1, v);
    else return search(m+1, r, v);
  }
Item STsearch(Key v)
  { return search(0, N-1, v); }
-----
#include &lt;stdlib.h&gt;
#include "Item.h"
typedef struct STnode* link;
struct STnode { Item item; link l, r; int N };
static link head, z;
link NEW(Item item, link l, link r, int N)
  { link x = malloc(sizeof *x);
    x-&gt;item = item; x-&gt;l = l; x-&gt;r = r; x-&gt;N = N;
    return x;
  }
void STinit()
  { head = (z = NEW(NULLitem, 0, 0, 0)); }
int STcount() { return head-&gt;N; }
Item searchR(link h, Key v)
  { Key t = key(h-&gt;item);
    if (h == z) return NULLitem;
    if eq(v, t) return h-&gt;item;
    if less(v, t) return searchR(h-&gt;l, v);
             else return searchR(h-&gt;r, v);
  }
Item STsearch(Key v)
  { return searchR(head, v); }
link insertR(link h, Item item)
  { Key v = key(item), t = key(h-&gt;item);
    if (h == z) return NEW(item, z, z, 1);
    if less(v, t)
         h-&gt;l = insertR(h-&gt;l, item);
    else h-&gt;r = insertR(h-&gt;r, item);
    (h-&gt;N)++; return h;
  }
void STinsert(Item item)
  { head = insertR(head, item); }
-----
void sortR(link h, void (*visit)(Item))
  {
    if (h == z) return;
    sortR(h-&gt;l, visit);
    visit(h-&gt;item);
    sortR(h-&gt;r, visit);
  }
void STsort(void (*visit)(Item))
  { sortR(head, visit); }
-----</P>
发表于 2005-2-26 16:08:03 | 显示全部楼层
<>
void STinsert(Item item)
  { Key v = key(item); link p = head, x = p;
    if (head == NULL)
      { head = NEW(item, NULL, NULL, 1); return; }
    while (x != NULL)
      {
        p = x; x-&gt;N++;
        x = less(v, key(x-&gt;item)) ? x-&gt;l : x-&gt;r;
      }
    x = NEW(item, NULL, NULL, 1);
    if (less(v, key(p-&gt;item))) p-&gt;l = x;
                          else p-&gt;r = x;
  }
-----
#define null(A) (eq(key(A), key(NULLitem)))
static char text[maxN];
main(int argc, char *argv[])
  { int i, t, N = 0; char query[maxQ]; char *v;
    FILE *corpus  = fopen(*++argv, "r");
    while ((t = getc(corpus)) != EOF)
      if (N &lt; maxN) text[N++] = t; else break;
    text[N] = '\0';
    STinit(maxN);
    for (i = 0; i &lt; N; i++) STinsert(&amp;text);
    while (gets(query) != NULL)
      if (!null(v = STsearch(query)))
           printf("%11d %s\n", v-text, query);
      else printf("(not found) %s\n", query);
  }
-----
link rotR(link h)
  { link x = h-&gt;l; h-&gt;l = x-&gt;r; x-&gt;r = h;
    return x; }
link rotL(link h)
  { link x = h-&gt;r; h-&gt;r = x-&gt;l; x-&gt;l = h;
    return x; }
-----
link insertT(link h, Item item)
  { Key v = key(item);
    if (h == z) return NEW(item, z, z, 1);
    if (less(v, key(h-&gt;item)))
      { h-&gt;l = insertT(h-&gt;l, item); h = rotR(h); }
    else
      { h-&gt;r = insertT(h-&gt;r, item); h = rotL(h); }
    return h;
  }
void STinsert(Item item)
  { head = insertT(head, item); }
-----
Item selectR(link h, int k)
  { int t = h-&gt;l-&gt;N;
    if (h == z) return NULLitem;
    if (t &gt; k) return selectR(h-&gt;l, k);
    if (t &lt; k) return selectR(h-&gt;r, k-t-1);
    return h-&gt;item;
  }
Item STselect(int k)
  { return selectR(head, k); }
-----
link partR(link h, int k)
  { int t = h-&gt;l-&gt;N;
    if (t &gt; k )
      { h-&gt;l = partR(h-&gt;l, k); h = rotR(h); }
    if (t &lt; k )
      { h-&gt;r = partR(h-&gt;r, k-t-1); h = rotL(h); }
    return h;
  }
-----
link joinLR(link a, link b)
  {
    if (b == z) return a;
    b = partR(b, 0); b-&gt;l = a;
    return b;
  }
link deleteR(link h, Key v)
  { link x; Key t = key(h-&gt;item);
    if (h == z) return z;
    if (less(v, t)) h-&gt;l = deleteR(h-&gt;l, v);
    if (less(t, v)) h-&gt;r = deleteR(h-&gt;r, v);
    if (eq(v, t))
      { x = h; h = joinLR(h-&gt;l, h-&gt;r); free(x); }
    return h;
  }
void STdelete(Key v)
  { head = deleteR(head, v); }
-----
link STjoin(link a, link b)
  {
    if (b == z) return a;
    if (a == z) return b;
    b = STinsert(b, a-&gt;item);
    b-&gt;l = STjoin(a-&gt;l, b-&gt;l);
    b-&gt;r = STjoin(a-&gt;r, b-&gt;r);
    free(a);   
    return b;
  }
-----</P><>----------
CHAPTER 13. Balanced Trees
-----
link balanceR(link h)
  {
    if (h-&gt;N &lt; 2) return h;
    h = partR(h, h-&gt;N/2);
    h-&gt;l = balanceR(h-&gt;l);
    h-&gt;r = balanceR(h-&gt;r);
    return h;
  }
-----
link insertR(link h, Item item)
  { Key v = key(item), t = key(h-&gt;item);
    if (h == z) return NEW(item, z, z, 1);
    if (rand()&lt; RAND_MAX/(h-&gt;N+1))
      return insertT(h, item);
    if less(v, t) h-&gt;l = insertR(h-&gt;l, item);
             else h-&gt;r = insertR(h-&gt;r, item);
    (h-&gt;N)++; return h;
  }
void STinsert(Item item)
  { head = insertR(head, item); }
-----
link STjoinR(link a, link b)
  {
    if (a == z) return b;
    b = STinsert(b, a-&gt;rec);
    b-&gt;l = STjoin(a-&gt;l, b-&gt;l);
    b-&gt;r = STjoin(a-&gt;r, b-&gt;r);
    fixN(b); free(a);
    return b;
  }
link STjoin(link a, link b)
  {
    if (rand()/(RAND_MAX/(a-&gt;N+b-&gt;N)+1) &lt; a-&gt;N)
         STjoinR(a, b);
    else STjoinR(b, a);
  }
-----
link joinLR(link a, link b)
  {
    if (a == z) return b;
    if (b == z) return a;
    if (rand()/(RAND_MAX/(a-&gt;N+b-&gt;N)+1) &lt; a-&gt;N)
         { a-&gt;r = joinLR(a-&gt;r, b); return a; }
    else { b-&gt;l = joinLR(a, b-&gt;l); return b; }
  }
-----
link splay(link h, Item item)
  { Key v = key(item);
    if (h == z) return NEW(item, z, z, 1);  
    if (less(v, key(h-&gt;item)))
      {
        if (hl == z) return NEW(item, z, h, h-&gt;N+1);
        if (less(v, key(hl-&gt;item)))
          { hll = splay(hll, item); h = rotR(h); }
        else
          { hlr = splay(hlr, item); hl = rotL(hl); }
        return rotR(h);
      }
    else
      {
        if (hr == z) return NEW(item, h, z, h-&gt;N+1);
        if (less(key(hr-&gt;item), v))
          { hrr = splay(hrr, item); h = rotL(h); }
        else
          { hrl = splay(hrl, item); hr = rotR(hr); }
        return rotL(h);
      }
  }
void STinsert(Item item)
  { head = splay(head, item); }
-----
link RBinsert(link h, Item item, int sw)
  { Key v = key(item);
    if (h == z) return NEW(item, z, z, 1, 1);  
    if ((hl-&gt;red) &amp;&amp; (hr-&gt;red))
      { h-&gt;red = 1; hl-&gt;red = 0; hr-&gt;red = 0; }
    if (less(v, key(h-&gt;item)))
      {
        hl = RBinsert(hl, item, 0);
        if (h-&gt;red &amp;&amp; hl-&gt;red &amp;&amp; sw) h = rotR(h);
        if (hl-&gt;red &amp;&amp; hll-&gt;red)
          { h = rotR(h); h-&gt;red = 0; hr-&gt;red = 1; }
      }
    else
      {
        hr = RBinsert(hr, item, 1);
        if (h-&gt;red &amp;&amp; hr-&gt;red &amp;&amp; !sw) h = rotL(h);
        if (hr-&gt;red &amp;&amp; hrr-&gt;red)
          { h = rotL(h); h-&gt;red = 0; hl-&gt;red = 1; }
      }
    fixN(h); return h;
  }
void STinsert(Item item)
  { head = RBinsert(head, item, 0); head-&gt;red = 0; }
-----
Item searchR(link t, Key v, int k)
  {
    if (eq(v, key(t-&gt;item))) return t-&gt;item;
    if (less(v, key(t-&gt;next[k]-&gt;item)))
      {
        if (k == 0) return NULLitem;
        return searchR(t, v, k-1);
      }
    return searchR(t-&gt;next[k], v, k);
  }
Item STsearch(Key v)
  { return searchR(head, v, lgN); }
-----
typedef struct STnode* link;
struct STnode { Item item; link* next; int sz; };
static link head, z;
static int N, lgN;
link NEW(Item item, int k)      
  { int i; link x = malloc(sizeof *x);
    x-&gt;next = malloc(k*sizeof(link));
    x-&gt;item = item; x-&gt;sz = k;
    for (i = 0; i &lt; k; i++) x-&gt;next = z;
    return x;                        
  }                                   
void STinit(int max)
  {
    N = 0; lgN = 0;
    z = NEW(NULLitem, 0);
    head = NEW(NULLitem, lgNmax);
  }
-----
int randX()
  { int i, j, t = rand();
    for (i = 1, j = 2; i &lt; lgNmax; i++, j += j)
      if (t &gt; RAND_MAX/j) break;
    if (i &gt; lgN) lgN = i;
    return i;
  }
void insertR(link t, link x, int k)
  { Key v = key(x-&gt;item);
    if (less(v, key(t-&gt;next[k]-&gt;item)))
      {
        if (k &lt; x-&gt;sz)
          { x-&gt;next[k] = t-&gt;next[k];
            t-&gt;next[k] = x; }
        if (k == 0) return;
        insertR(t, x, k-1); return;
      }
    insertR(t-&gt;next[k], x, k);
  }
void STinsert(Key v)
  { insertR(head, NEW(v, randX()), lgN); N++; }
-----
void deleteR(link t, Key v, int k)
  { link x = t-&gt;next[k];
    if (!less(key(x-&gt;item), v))
      {
        if (eq(v, key(x-&gt;item)))
          { t-&gt;next[k] = x-&gt;next[k]; }
        if (k == 0) { free(x); return; }
        deleteR(t, v, k-1); return;
      }
    deleteR(t-&gt;next[k], v, k);
  }
void STdelete(Key v)
  { deleteR(head, v, lgN); N--; }</P><>----------
CHAPTER 14. Hashing
-----
int hash(char *v, int M)
  { int h = 0, a = 127;
    for (; *v != '\0'; v++)
      h = (a*h + *v) % M;
    return h;
  }
-----
int hashU(char *v, int M)
  { int h, a = 31415, b = 27183;
    for (h = 0; *v != '\0'; v++, a = a*b % (M-1))
        h = (a*h + *v) % M;
    return h;
  }
-----
static link *heads, z;
static int N, M;
void STinit(int max)
  { int i;
    N = 0; M = max/5;
    heads = malloc(M*sizeof(link));
    z = NEW(NULLitem, NULL);
    for (i = 0; i &lt; M; i++) heads = z;
  }
Item STsearch(Key v)
  { return searchR(heads[hash(v, M)], v); }
void STinsert(Item item)
  { int i = hash(key(item), M);
    heads = NEW(item, heads); N++; }
void STdelete(Item item)
  { int i = hash(key(item), M);
    heads = deleteR(heads, item); }
-----
#include &lt;stdlib.h&gt;
#include "Item.h"
#define null(A) (key(st[A]) == key(NULLitem))
static int N, M;
static Item *st;
void STinit(int max)
  { int i;
    N = 0; M = 2*max;
    st = malloc(M*sizeof(Item));
    for (i = 0; i &lt; M; i++) st = NULLitem;
  }
int STcount() { return N; }
void STinsert(Item item)
  { Key v = key(item);
    int i = hash(v, M);
    while (!null(i)) i = (i+1) % M;
    st = item; N++;
  }
Item STsearch(Key v)
  { int i = hash(v, M);
    while (!null(i))
      if eq(v, key(st)) return st;
      else i = (i+1) % M;
    return NULLitem;
  }
-----
void STdelete(Item item)
  { int j, i = hash(key(item), M); Item v;
    while (!null(i))
      if eq(key(item), key(st)) break;
      else i = (i+1) % M;
    if (null(i)) return;
    st = NULLitem; N--;
    for (j = i+1; !null(j); j = (j+1) % M, N--)
      { v = st[j]; st[j] = NULLitem; STinsert(v); }
  }
-----
void STinsert(Item item)
  { Key v = key(item);
    int i = hash(v, M);
    int k = hashtwo(v, M);
    while (!null(i)) i = (i+k) % M;
    st = item; N++;
  }
Item STsearch(Key v)
  { int i = hash(v, M);
    int k = hashtwo(v, M);
    while (!null(i))
      if eq(v, key(st)) return st;
      else i = (i+k) % M;
    return NULLitem;
  }
-----
void expand();
void STinsert(Item item)
  { Key v = key(item);
    int i = hash(v, M);
    while (!null(i)) i = (i+1) % M;
    st = item;
    if (N++ &gt; M/2) expand();
  }
void expand()
  { int i; Item *t = st;
    init(M+M);
    for (i = 0; i &lt; M/2; i++)
      if (key(t) != key(NULLitem))
        STinsert(t);
    free(t);
  }</P><P>----------
CHAPTER 15. Radix Search
-----
Item searchR(link h, Key v, int w)
  { Key t = key(h-&gt;item);
    if (h == z) return NULLitem;
    if eq(v, t) return h-&gt;item;
    if (digit(v, w) == 0)
         return searchR(h-&gt;l, v, w+1);
    else return searchR(h-&gt;r, v, w+1);
  }
Item STsearch(Key v)
  { return searchR(head, v, 0); } </P>
发表于 2005-2-26 16:08:24 | 显示全部楼层

-----
#define leaf(A) ((h-&gt;l == z) &amp;&amp; (h-&gt;r == z))
Item searchR(link h, Key v, int w)
  { Key t = key(h-&gt;item);
    if (h == z) return NULLitem;
    if (leaf(h))
      return eq(v, t) ? h-&gt;item : NULLitem;
    if (digit(v, w) == 0)
         return searchR(h-&gt;l, v, w+1);
    else return searchR(h-&gt;r, v, w+1);
  }
Item STsearch(Key v)
  { return searchR(head, v, 0); }
-----
void STinit()
  { head = (z = NEW(NULLitem, 0, 0, 0)); }
link split(link p, link q, int w)
  { link t = NEW(NULLitem, z, z, 2);
    switch(digit(p-&gt;item, w)*2 + digit(q-&gt;item, w))
      {
        case 0: t-&gt;l = split(p, q, w+1); break;
        case 1: t-&gt;l = p; t-&gt;r = q; break;
        case 2: t-&gt;r = p; t-&gt;l = q; break;
        case 3: t-&gt;r = split(p, q, w+1); break;
      }
    return t;
  }
link insertR(link h, Item item, int w)
  { Key v = key(item), t = key(h-&gt;item);
    if (h == z) return NEW(item, z, z, 1);
    if (leaf(h))
      { return split(NEW(item, z, z, 1), h, w); }
    if (digit(v, w) == 0)
         h-&gt;l = insertR(h-&gt;l, item, w+1);
    else h-&gt;r = insertR(h-&gt;r, item, w+1);
    return h;
  }
void STinsert(Item item)
  { head = insertR(head, item, 0); }
-----
Item searchR(link h, Key v, int w)
  {
    if (h-&gt;bit &lt;= w) return h-&gt;item;
    if (digit(v, h-&gt;bit) == 0)
         return searchR(h-&gt;l, v, h-&gt;bit);
    else return searchR(h-&gt;r, v, h-&gt;bit);
  }
Item STsearch(Key v)
  { Item t = searchR(head-&gt;l, v, -1);
    return eq(v, key(t)) ? t : NULLitem;
  }
-----
void STinit()
  { head = NEW(NULLitem, 0, 0, -1);
    head-&gt;l = head; head-&gt;r = head; }
link insertR(link h, Item item, int w, link p)
  { link x; Key v = key(item);
    if ((h-&gt;bit &gt;= w) || (h-&gt;bit &lt;= p-&gt;bit))
      {
        x = NEW(item, 0, 0, w);
        x-&gt;l = digit(v, x-&gt;bit) ? h : x;
        x-&gt;r = digit(v, x-&gt;bit) ? x : h;
        return x;
      }
    if (digit(v, h-&gt;bit) == 0)
         h-&gt;l = insertR(h-&gt;l, item, w, h);
    else h-&gt;r = insertR(h-&gt;r, item, w, h);
    return h;
  }
void STinsert(Item item)
  { int i;
    Key v = key(item);
    Key t = key(searchR(head-&gt;l, v, -1));
    if (v == t) return;
    for (i = 0; digit(v, i) == digit(t, i); i++) ;
    head-&gt;l = insertR(head-&gt;l, item, i, head);
  }
-----
void sortR(link h, void (*visit)(Item), int w)
  {
    if (h-&gt;bit &lt;= w) { visit(h-&gt;item); return; }
    sortR(h-&gt;l, visit, h-&gt;bit);
    sortR(h-&gt;r, visit, h-&gt;bit);
  }
void STsort(void (*visit)(Item))
  { sortR(head-&gt;l, visit, -1); }
-----
typedef struct STnode *link;
struct STnode { link next[R]; };
static link head;
void STinit() { head = NULL; }
link NEW()
  { int i;
    link x = malloc(sizeof *x);
    for (i = 0; i &lt; R; i++) x-&gt;next = NULL;
    return x;
  }
Item searchR(link h, Key v, int w)
  { int i = digit(v, w);
    if (h == NULL) return NULLitem;
    if (i == NULLdigit) return v;
    return searchR(h-&gt;next, v, w+1);
  }
Item STsearch(Key v)
  { return searchR(head, v, 0); }
link insertR(link h, Item item, int w)
  { Key v = key(item);
    int i = digit(v, w);
    if (h == NULL) h = NEW();
    if (i == NULLdigit) return h;
    h-&gt;next = insertR(h-&gt;next, v, w+1);
    return h;
  }
void STinsert(Item item)
  { head = insertR(head, item, 0); N++; }
-----
typedef struct STnode* link;
struct STnode { Item item; int d; link l, m, r; };
static link head;
void STinit() { head = NULL; }
link NEW(int d)
  { link x = malloc(sizeof *x);
    x-&gt;d = d; x-&gt;l = NULL; x-&gt;m = NULL; x-&gt;r = NULL;
    return x;
  }
Item searchR(link h, Key v, int w)
  { int i = digit(v, w);
    if (h == NULL) return NULLitem;
    if (i == NULLdigit) return v;
    if (i &lt; h-&gt;d) return searchR(h-&gt;l, v, w);
    if (i == h-&gt;d) return searchR(h-&gt;m, v, w+1);
    if (i &gt; h-&gt;d) return searchR(h-&gt;r, v, w);
  }
Item STsearch( Key v)
  { return searchR(head, v, 0); }
link insertR(link h, Item item, int w)
  { Key v = key(item);
    int i = digit(v, w);
    if (h == NULL) h = NEW(i);
    if (i == NULLdigit) return h;
    if (i &lt; h-&gt;d) h-&gt;l = insertR(h-&gt;l, v, w);
    if (i == h-&gt;d) h-&gt;m = insertR(h-&gt;m, v, w+1);
    if (i &gt; h-&gt;d) h-&gt;r = insertR(h-&gt;r, v, w);
    return h;
  }
void STinsert(Key key)
  { head = insertR(head, key, 0); }
-----
char word[maxW];
void matchR(link h, char *v, int i)
  {
    if (h == z) return;
    if ((*v == '\0') &amp;&amp; (h-&gt;d == '\0'))
      { word = h-&gt;d; printf("%s ", word); }
    if ((*v == '*') || (*v == h-&gt;d))
      { word = h-&gt;d; matchR(h-&gt;m, v+1, i+1); }
    if ((*v == '*') || (*v &lt; h-&gt;d))
      matchR(h-&gt;l, v, i);
    if ((*v == '*') || (*v &gt; h-&gt;d))
      matchR(h-&gt;r, v, i);
  }
void STmatch(char *v)
  { matchR(head, v, 0); }
-----
#define internal(A) ((A-&gt;d) != NULLdigit)
link NEWx(link h, int d)
  { link x = malloc(sizeof *x);
    x-&gt;item = NULLitem; x-&gt;d = d;
    x-&gt;l = NULL; x-&gt;m = h; x-&gt;r = NULL;
    return x;
  }
link split(link p, link q, int w)
  { int pd = digit(p-&gt;item, w),
        qd = digit(q-&gt;item, w);
    link t = NEW(NULLitem, qd);
    if (pd &lt; qd) { t-&gt;m = q; t-&gt;l = NEWx(p, pd); }
    if (pd == qd) { t-&gt;m = split(p, q, w+1); }
    if (pd &gt; qd) { t-&gt;m = q; t-&gt;r = NEWx(p, pd); }
    return t;
  }
link insertR(link h, Item item, int w)
  { Key v = key(item);
    int i = digit(v, w);
    if (h == NULL)
      return NEWx(NEW(item, NULLdigit), i);
    if (!internal(h))
      return split(NEW(item, NULLdigit), h, w);
    if (i &lt; h-&gt;d) h-&gt;l = insertR(h-&gt;l, v, w);
    if (i == h-&gt;d) h-&gt;m = insertR(h-&gt;m, v, w+1);
    if (i &gt; h-&gt;d) h-&gt;r = insertR(h-&gt;r, v, w);
    return h;
  }
void STinsert(Key key)
  { int i = digit(key, 0);
    heads = insertR(heads, key, 1);
  }
-----
Item searchR(link h, Key v, int w)
  { int i = digit(v, w);
    if (h == NULL) return NULLitem;
    if (internal(h))
      {
        if (i &lt; h-&gt;d) return searchR(h-&gt;l, v, w);
        if (i == h-&gt;d) return searchR(h-&gt;m, v, w+1);
        if (i &gt; h-&gt;d) return searchR(h-&gt;r, v, w);
      }
    if eq(v, key(h-&gt;item)) return h-&gt;item;
    return NULLitem;
  }
Item STsearch(Key v)
  { return searchR(heads[digit(v, 0)], v, 1); }
-----
typedef struct STnode* link;
struct STnode { Item item; link l, m, r; };
static link head;
#define z NULL
void STinit() { head = z; }
link NEW(char *v)
  { link x = malloc(sizeof *x);
    x-&gt;item = v; x-&gt;l = z; x-&gt;m = z; x-&gt;r = z;
    return x;
  }
Item searchR(link h, char *v)
  { char *t;
    if (h == z) return NULLitem;
    if (*v == '\0') return h-&gt;item;
    if (*v &lt; *(h-&gt;item)) searchR(h-&gt;l, v);
    if (*v &gt; *(h-&gt;item)) searchR(h-&gt;r, v);
    if (*v == *(h-&gt;item)) t = searchR(h-&gt;m, v+1);
    return null(t) ? t : v;
  }
Item STsearch(char *v)
  { char *t = searchR(head, v);
    if (eq(v, t)) return t;
    return NULLitem;
  }
link insertR(link h, char *v)
  {
    if (h == z) h = NEW(v);
    if ((*v ==  *(h-&gt;item)) &amp;&amp; (*v != '\0'))
      h-&gt;m = insertR(h-&gt;m, v+1);
    if (h == z) h = NEW(v);
    if (*v &lt; *(h-&gt;item)) h-&gt;l = insertR(h-&gt;l, v);
    if (*v &gt; *(h-&gt;item)) h-&gt;r = insertR(h-&gt;r, v);
    return h;
  }
void STinsert(char *v)
  { head = insertR(head, v); }
发表于 2005-2-26 16:08:36 | 显示全部楼层
<>        </P><>
----------
CHAPTER 16. External Searching
-----
typedef struct STnode* link;
typedef struct
  { Key key; union { link next; Item item; } ref; }
entry;
struct STnode { entry b[M]; int m; };
static link head;
static int H, N;
link NEW()
  { link x = malloc(sizeof *x);
    x-&gt;m = 0;
    return x;
  }
void STinit(int maxN)
  { head = NEW(); H = 0; N = 0; }
-----
Item searchR(link h, Key v, int H)
  { int j;
    if (H == 0)
      for (j = 0; j &lt; h-&gt;m; j++)
        if (eq(v, h-&gt;b[j].key))
          return h-&gt;b[j].ref.item;
    if (H != 0)
      for (j = 0; j &lt; h-&gt;m; j++)
        if ((j+1 == h-&gt;m) || less(v, h-&gt;b[j+1].key))
          return searchR(h-&gt;b[j].ref.next, v, H-1);
    return NULLitem;
  }
Item STsearch(Key v)
  { return searchR(head, v, H); }
-----
link insertR(link h, Item item, int H)
  { int i, j; Key v = key(item); entry x; link u;
    x.key = v; x.ref.item = item;
    if (H == 0)
      for (j = 0; j &lt; h-&gt;m; j++)
        if (less(v, h-&gt;b[j].key)) break;
    if (H != 0)
      for (j = 0; j &lt; h-&gt;m; j++)
        if ((j+1 == h-&gt;m) || less(v, h-&gt;b[j+1].key))
          {
            u = insertR(h-&gt;b[j++].ref.next, v, H-1);
            if (u == NULL) return NULL;
            x.key = u-&gt;b[0].key; x.ref.next = u;
            break;
          }
    for (i = ++(h-&gt;m); (i &gt; j) &amp;&amp; (i != M); i--)
      h-&gt;b = h-&gt;b[i-1];
    h-&gt;b[j] = x;
    if (h-&gt;m &lt; M) return NULL; else return split(h);
  }
void STinsert(Item item)
  { link t, u = insertR(head, item, H);
    if (u == NULL) return;
    t = NEW(); t-&gt;m = 2;
    t-&gt;b[0].key = head-&gt;b[0].key;
    t-&gt;b[0].ref.next = head;
    t-&gt;b[1].key =  u-&gt;b[0].key;
    t-&gt;b[1].ref.next = u;
    head = t; H++;
  }
-----
link split(link h)
  { int j; link t = NEW();
    for (j = 0; j &lt; M/2; j++)
      t-&gt;b[j] = h-&gt;b[M/2+j];
    h-&gt;m = M/2; t-&gt;m = M/2;
    return t;   
  }
-----
typedef struct STnode* link;
struct STnode { Item b[M]; int m; int k; };
static link *dir;
static int d, D, N;
link NEW()
  { link x = malloc(sizeof *x);
    x-&gt;m = 0;  x-&gt;k = 0;
    return x;
  }
void STinit(int maxN)
  {
    d = 0; N = 0; D = 1;
    dir = malloc(D*(sizeof *dir));
    dir[0] = NEW();
  }
-----
Item search(link h, Key v)
  { int j;
    for (j = 0; j &lt; h-&gt;m; j++)
      if (eq(v, key(h-&gt;b[j])))
        return h-&gt;b[j];
    return NULLitem;
  }
Item STsearch(Key v)
  { return search(dir[bits(v, 0, d)], v); }
-----
link split(link h)
  { int j; link t = NEW();
    while (h-&gt;m == M)
      {
        h-&gt;m = 0; t-&gt;m = 0;
        for (j = 0; j &lt; M; j++)
          if (bits(h-&gt;b[j], h-&gt;k, 1) == 0)
               h-&gt;b[(h-&gt;m)++] = h-&gt;b[j];
          else t-&gt;b[(t-&gt;m)++] = h-&gt;b[j];
        t-&gt;k = ++(h-&gt;k);
        if (t-&gt;m == M) h = t;
      }
    insertDIR(t, t-&gt;k);
  }
void insert(link h, Item item)
  { int i, j; Key v = key(item);
    for (j = 0; j &lt; h-&gt;m; j++)
      if (less(v, key(h-&gt;b[j]))) break;
    for (i = (h-&gt;m)++; i &gt; j; i--)
      h-&gt;b = h-&gt;b[i-1];
    h-&gt;b[j] = item;
    if (h-&gt;m == M) split(h);
  }
void STinsert(Item item)
  { insert(dir[bits(key(item), 0, d)], item); }
-----
void insertDIR(link t, int k)
  { int i, m, x = bits(t-&gt;b[0], 0, k);
    while (d &lt; k)
      { link *old = dir;
        d += 1; D += D;
        dir = malloc(D*(sizeof *dir));
        for (i = 0; i &lt; D; i++) dir = old[i/2];        
        if (d &lt; k) dir(bits(x, 0, d) ^ 1) = NEW();
      }
    for (m = 1; k &lt; d; k++) m *= 2;
    for (i = 0; i &lt; m; i++) dir[x*m+i] = t;        
  }</P>
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-11-27 18:25 , Processed in 0.070808 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表