📄 algorithmsinc++,thirdedition,parts1-4,code.txt
字号:
if ((t == '+') || (t == '*'))
{ x->l = parse(); x->r = parse(); }
return x;
}
-----
void traverse(int k, void visit(int))
{ visit(k); visited[k] = 1;
for (link t = adj[k]; t != 0; t = t->next)
if (!visited[t->v]) traverse(t->v, visit);
}
-----
void traverse(int k, void visit(int))
{
QUEUE<int> q(V*V);
q.put(k);
while (!q.empty())
if (visited[k = q.get()] == 0)
{
visit(k); visited[k] = 1;
for (link t = adj[k]; t != 0; t = t->next)
if (visited[t->v] == 0) q.put(t->v);
}
}
-----
----------
CHAPTER 6. Elementary Sorting Methods
-----
#include <iostream.h>
#include <stdlib.h>
template <class Item>
void exch(Item &A, Item &B)
{ Item t = A; A = B; B = t; }
template <class Item>
void compexch(Item &A, Item &B)
{ if (B < A) exch(A, B); }
template <class Item>
void sort(Item a[], int l, int r)
{ for (int i = l+1; i <= r; i++)
for (int j = i; j > l; j--)
compexch(a[j-1], a[j]);
}
int main(int argc, char *argv[])
{ int i, N = atoi(argv[1]), sw = atoi(argv[2]);
int *a = new int[N];
if (sw)
for (i = 0; i < N; i++)
a[i] = 1000*(1.0*rand()/RAND_MAX);
else
{ N = 0; while (cin >> a[N]) N++; }
sort(a, 0, N-1);
for (i = 0; i < N; i++) cout << a[i] << " ";
cout << endl;
}
-----
template <class Item>
void selection(Item a[], int l, int r)
{ for (int i = l; i < r; i++)
{ int min = i;
for (int j = i+1; j <= r; j++)
if (a[j] < a[min]) min = j;
exch(a[i], a[min]);
}
}
-----
template <class Item>
void insertion(Item a[], int l, int r)
{ int i;
for (i = r; i > l; i--) compexch(a[i-1], a[i]);
for (i = l+2; i <= r; i++)
{ int j = i; Item v = a[i];
while (v < a[j-1])
{ a[j] = a[j-1]; j--; }
a[j] = v;
}
}
-----
template <class Item>
void bubble(Item a[], int l, int r)
{ for (int i = l; i < r; i++)
for (int j = r; j > i; j--)
compexch(a[j-1], a[j]);
}
-----
template <class Item>
void shellsort(Item a[], int l, int r)
{ int h;
for (h = 1; h <= (r-l)/9; h = 3*h+1) ;
for ( ; h > 0; h /= 3)
for (int i = l+h; i <= r; i++)
{ int j = i; Item v = a[i];
while (j >= l+h && v < a[j-h])
{ a[j] = a[j-h]; j -= h; }
a[j] = v;
}
}
-----
#include <stdlib.h>
#include "Item.h"
#include "exch.h"
#include "Array.h"
main(int argc, char *argv[])
{ int N = atoi(argv[1]), sw = atoi(argv[2]);
Item *a = new Item[N];
if (sw) rand(a, N); else scan(a, N);
sort(a, 0, N-1);
show(a, 0, N-1);
}
-----
template <class Item>
void rand(Item a[], int N);
template <class Item>
void scan(Item a[], int &N);
template <class Item>
void show(Item a[], int l, int r);
template <class Item>
void sort(Item a[], int l, int r);
-----
#include <iostream.h>
#include <stdlib.h>
#include "Array.h"
template <class Item>
void rand(Item a[], int N)
{ for (int i = 0; i < N; i++) rand(a[i]); }
template <class Item>
void scan(Item a[], int &N)
{ for (int i = 0; i < N; i++)
if (!scan(a[i])) break;
N = i;
}
template <class Item>
void show(Item a[], int l, int r)
{ for (int i = l; i <=r; i++)
show(a[i]);
cout << endl;
}
-----
typedef struct record { int key; float info; } Item;
int operator<(const Item&, const Item&);
int scan(Item&);
void rand(Item&);
void show(const Item&);
-----
#include <iostream.h>
#include <stdlib.h>
#include "Item.h"
int operator<(const Item& A, const Item& B)
{ return A.key < B.key; }
int scan(Item& x)
{ return (cin >> x.key >> x.info) != 0; }
void rand(Item& x)
{ x.key = 1000*(1.0*rand()/RAND_MAX);
x.info = 1.0*rand()/RAND_MAX; }
void show(const Item& x)
{ cout << x.key << " " << x.info << endl; }
-----
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
#include "Item.h"
static char buf[100000];
static int cnt = 0;
int operator<(const Item& a, const Item& b)
{ return strcmp(a.str, b.str) < 0; }
void show(const Item& x)
{ cout << x.str << " "; }
int scan(Item& x)
{ int flag = (cin >> (x.str = &buf[cnt])) != 0;
cnt += strlen(x.str)+1;
return flag;
}
-----
struct record { char name[30]; int num; };
typedef struct { record *r; } Item;
int operator<(const Item&, const Item&);
void rand(Item&);
void show(const Item&);
int scan(Item&);
-----
static record data[maxN];
static int cnt = 0;
void show(const Item& x)
{ cout << x.r->name << " " << x.r->num << endl; }
int scan(Item& x)
{
x.r = &data[cnt++];
return (cin >> x.r->name >> x.r->num) != 0;
}
-----
template <class Item>
void insitu(Item data[], Index a[], int N)
{ for (int i = 0; i < N; i++)
{ Item v = data[i];
int j, k;
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;
}
}
-----
struct node
{ Item item; node* next;
node(Item x)
{ item = x; next = 0; }
};
typedef node *link;
link randlist(int);
link scanlist(int&);
void showlist(link);
link sortlist(link);
-----
link listselection(link h)
{ node dummy(0); link head = &dummy, out = 0;
head->next = h;
while (head->next != 0)
{ link max = findmax(head), t = max->next;
max->next = t->next;
t->next = out; out = t;
}
return out;
}
-----
void distcount(int a[], int l, int r)
{ int i, j, cnt[M];
static int b[maxN];
for (j = 0; j < M; j++) cnt[j] = 0;
for (i = l; i <= r; i++) cnt[a[i]+1]++;
for (j = 1; j < M; j++) cnt[j] += cnt[j-1];
for (i = l; i <= r; i++) b[cnt[a[i]]++] = a[i];
for (i = l; i <= r; i++) a[i] = b[i-l];
}
----------
CHAPTER 7. Quicksort
-----
template <class Item>
void quicksort(Item a[], int l, int r)
{
if (r <= l) return;
int i = partition(a, l, r);
quicksort(a, l, i-1);
quicksort(a, i+1, r);
}
-----
template <class Item>
int partition(Item a[], int l, int r)
{ int i = l-1, j = r; Item v = a[r];
for (;;)
{
while (a[++i] < v) ;
while (v < a[--j]) if (j == l) break;
if (i >= j) break;
exch(a[i], a[j]);
}
exch(a[i], a[r]);
return i;
}
-----
#include "STACK.cxx"
inline void push2(STACK<int> &s, int A, int B)
{ s.push(B); s.push(A); }
template <class Item>
void quicksort(Item a[], int l, int r)
{ STACK<int> s(50);
push2(s, l, r);
while (!s.empty())
{
l = s.pop(); r = s.pop();
if (r <= l) continue;
int i = partition(a, l, r);
if (i-l > r-i)
{ push2(s, l, i-1); push2(s, i+1, r); }
else
{ push2(s, i+1, r); push2(s, l, i-1); }
}
}
-----
static const int M = 10;
template <class Item>
void quicksort(Item a[], int l, int r)
{
if (r-l <= 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]);
int i = partition(a, l+1, r-1);
quicksort(a, l, i-1);
quicksort(a, i+1, r);
}
template <class Item>
void hybridsort(Item a[], int l, int r)
{ quicksort(a, l, r); insertion(a, l, r); }
-----
template <class Item>
int operator==(const Item &A, const Item &B)
{ return !less(A, B) && !less(B, A); }
template <class Item>
void quicksort(Item a[], int l, int r)
{ int k; Item v = a[r];
if (r <= l) return;
int i = l-1, j = r, p = l-1, q = r;
for (;;)
{
while (a[++i] < v) ;
while (v < a[--j]) if (j == l) break;
if (i >= j) break;
exch(a[i],a[j]);
if (a[i] == v) { p++; exch(a[p],a[i]); }
if (v == a[j]) { q--; exch(a[q],a[j]); }
}
exch(a[i], a[r]); j = i-1; i = i+1;
for (k = l ; k <= p; k++, j--) exch(a[k],a[j]);
for (k = r-1; k >= q; k--, i++) exch(a[k],a[i]);
quicksort(a, l, j);
quicksort(a, i, r);
}
-----
template <class Item>
void select(Item a[], int l, int r, int k)
{
if (r <= l) return;
int i = partition(a, l, r);
if (i > k) select(a, l, i-1, k);
if (i < k) select(a, i+1, r, k);
}
-----
template <class Item>
void select(Item a[], int l, int r, int k)
{
while (r > l)
{ int i = partition(a, l, r);
if (i >= k) r = i-1;
if (i <= k) l = i+1;
}
}
----------
CHAPTER 8. Mergesort
-----
template <class Item>
void mergeAB(Item c[], Item a[], int N,
Item b[], int M )
{
for (int i = 0, j = 0, k = 0; k < N+M; k++)
{
if (i == N) { c[k] = b[j++]; continue; }
if (j == M) { c[k] = a[i++]; continue; }
c[k] = (a[i] < b[j]) ? a[i++] : b[j++];
}
}
-----
template <class Item>
void merge(Item a[], int l, int m, int r)
{ int i, j;
static Item aux[maxN];
for (i = m+1; i > l; i--) aux[i-1] = a[i-1];
for (j = m; j < r; j++) aux[r+m-j] = a[j+1];
for (int k = l; k <= r; k++)
if (aux[j] < aux[i])
a[k] = aux[j--]; else a[k] = aux[i++];
}
-----
template <class Item>
void mergesort(Item a[], int l, int r)
{ if (r <= l) return;
int m = (r+l)/2;
mergesort(a, l, m);
mergesort(a, m+1, r);
merge(a, l, m, r);
}
-----
template <class Item>
void mergesortABr(Item a[], Item b[], int l, int r)
{ if (r-l <= 10) { insertion(a, l, r); return; }
int m = (l+r)/2;
mergesortABr(b, a, l, m);
mergesortABr(b, a, m+1, r);
mergeAB(a+l, b+l, m-l+1, b+m+1, r-m);
}
template <class Item>
void mergesortAB(Item a[], int l, int r)
{ static Item aux[maxN];
for (int i = l; i <= r; i++) aux[i] = a[i];
mergesortABr(a, aux, l, r);
}
-----
inline int min(int A, int B)
{ return (A < B) ? A : B; }
template <class Item>
void mergesortBU(Item a[], int l, int r)
{
for (int m = 1; m <= r-l; m = m+m)
for (int i = l; i <= r-m; i += m+m)
merge(a, i, i+m-1, min(i+m+m-1, r));
}
-----
link merge(link a, link b)
{ node dummy(0); link head = &dummy, c = head;
while ((a != 0) && (b != 0))
if (a->item < b->item)
{ c->next = a; c = a; a = a->next; }
else
{ c->next = b; c = b; b = b->next; }
c->next = (a == 0) ? b : a;
return head->next;
}
-----
link mergesort(link c)
{
if (c == 0 || c->next == 0) return c;
link a = c, b = c->next;
while ((b != 0) && (b->next != 0))
{ c = c->next; b = b->next->next; }
b = c->next; c->next = 0;
return merge(mergesort(a), mergesort(b));
}
-----
link mergesort(link t)
{ QUEUE<link> Q(max);
if (t == 0 || t->next == 0) return t;
for (link u = 0; t != 0; t = u)
{ u = t->next; t->next = 0; Q.put(t); }
t = Q.get();
while (!Q.empty())
{ Q.put(t); t = merge(Q.get(), Q.get()); }
return t;
}
----------
CHAPTER 9. Priority Queues and Heapsort
-----
template <class Item>
class PQ
{
private:
// Implementation-dependent code
public:
PQ(int);
int empty() const;
void insert(Item);
Item getmax();
};
-----
template <class Item>
class PQ
{
private:
Item *pq;
int N;
public:
PQ(int maxN)
{ pq = new Item[maxN]; N = 0; }
int empty() const
{ return N == 0; }
void insert(Item item)
{ pq[N++] = item; }
Item getmax()
{ int max = 0;
for (int j = 1; j < N; j++)
if (pq[max] < pq[j]) max = j;
exch(pq[max], pq[N-1]);
return pq[--N];
}
};
-----
template <class Item>
void fixUp(Item a[], int k)
{
while (k > 1 && a[k/2] < a[k])
{ exch(a[k], a[k/2]); k = k/2; }
}
-----
template <class Item>
void fixDown(Item a[], int k, int N)
{
while (2*k <= N)
{ int j = 2*k;
if (j < N && a[j] < a[j+1]) j++;
if (!(a[k] < a[j])) break;
exch(a[k], a[j]); k = j;
}
}
-----
template <class Item>
class PQ
{
private:
Item *pq;
int N;
public:
PQ(int maxN)
{ pq = new Item[maxN+1]; N = 0; }
int empty() const
{ return N == 0; }
void insert(Item item)
{ pq[++N] = item; fixUp(pq, N); }
Item getmax()
{
exch(pq[1], pq[N]);
fixDown(pq, 1, N-1);
return pq[N--];
}
};
-----
#include "PQ.cxx"
template <class Item>
void PQsort(Item a[], int l, int r)
{ int k;
PQ<Item> pq(r-l+1);
for (k = l; k <= r; k++) pq.insert(a[k]);
for (k = r; k >= l; k--) a[k] = pq.getmax();
}
-----
template <class Item>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -