主题:[原创]常用算法(代码)--陆续增加中
游侠UFO
[专家分:1200] 发布于 2005-12-25 10:12:00
这些几乎都是我平时根据一些书上的算法描述写出来的.
如果有错误的地方,请大家及时提出,以便我及时更改,谢谢!
冒泡排序:
for i:=1 to (n-1) do
for j:=n downto (i+1) do
if a[j]<a[j-1] then //这是从大到小排列,如果是从小到大排列,则应是a[j]>a[j-1]
begin
k:=a[j-1];
a[j-1]:=a[j];
a[j]:=k;
end;
回复列表 (共40个回复)
沙发
游侠UFO [专家分:1200] 发布于 2005-10-16 10:35:00
直接插入排序:
x:需要插入数组的数;
count:数组中现有元素个数;
bz:boolean,为是否向数组末尾插入的标记
{main}
bz:=true;
for i:=1 to count do
if x<a[i] then //如果是从大到小排列,则应为x>a[i]
begin
for j:=count downto i do a[j+1]:=a[j];
a[i]:=x;
count:=count+1;
bz:=false;
break;
end;
if bz then
begin
count:=count+1;
a[count]:=x;
end;
板凳
游侠UFO [专家分:1200] 发布于 2005-10-16 10:44:00
Floyed算法:(求图中任意两节点的最短路径及长度)
g:array[1..x,1..x] of integer; //储存图的矩阵
a:array[1..x,1..x] of integer; //保存最短路径长度,初始值为maxint
p:array[1..x,1..x] of set of integer; //保存最短路径
{main}
假设有n个节点
for i:=1 to n do
for j:=1 to n do
if g[i,j]>0 then
begin
a[i,j]:=g[i,j];
p[i,j]:=[i]+[j];
end;
for k:=1 to n do //以k为桥梁求从i到j的最短路径
for i:=1 to n do
for j:=1 to n do
begin
if (i=j) or (i=k) or (j=k) then continue;
if a[i,k]+a[k,j]<a[i,j] then
begin
a[i,j]:=a[i,k]+a[k,j];
p[i,j]:=p[i,k]+p[k,j];
end;
end;
3 楼
游侠UFO [专家分:1200] 发布于 2005-10-16 10:56:00
根据二叉树先序和中序还原二叉树:
procedure create(var tree:treetype; pre:string{先序}; mid{中序):string);
var
...
begin
x:=pos(pre[1],mid);
ltm:=copy(mid,1,x-1); //求左子树中序
rtm:=copy(mid,x+1,length(mid)-x); //求右子树中序
ltp:=copy(pre,2,length(ltm)); //求左子树先序
rtp:=copy(pre,length(ltm)+2,length(rtm)); //求右子树先序
if length(ltp)>0 then //还原左子树
begin
tree[pre[1]].lch:=ltp[1];
create(tree,ltp,ltm);
end;
if length(rtp)>0 then //还原右子树
begin
tree[pre[1]].rch:=rtp[1];
create(tree,rtp,rtm);
end;
end;
4 楼
游侠UFO [专家分:1200] 发布于 2005-10-16 11:02:00
二叉树的遍历:
procedure order(x:integer);
begin
if x<>0 then
begin
先序:write(tree[x].data);
order(tree[x].lch);
order(tree[x].rch);
中序:order(tree[x].lch);
write(tree[x].data);
order(tree[x].rch);
后序:order(tree[x].lch);
order(tree[x].rch);
write(tree[x].data);
end;
end;
5 楼
游侠UFO [专家分:1200] 发布于 2005-10-16 11:11:00
树的宽度优先搜索:
procedure widesearch(tree:treetype; var team:teamtype);
var
...
begin
x:=team.data[team.head];
team.head:=team.head+1;
访问节点x;
for i:=1 to tree[x].degree do
begin
team.tail:=team.tail+1;
team.data[team.tail]:=tree[x].child[i];
end;
if team.head<=team.tail then widesearch(tree,team);
end.
6 楼
游侠UFO [专家分:1200] 发布于 2005-10-16 11:14:00
树的深度优先搜索:
procedure deepsearch(tree:treetype; x:integer);
var
...
begin
访问节点x;
for i:=1 to tree[x].degree do
if tree[x].child[i]<>0 then deepsearch(tree,tree[x].child[i]);
end;
7 楼
游侠UFO [专家分:1200] 发布于 2005-10-16 11:21:00
Prim算法(求图的最小生成树):
s:集合类型,存放访问过的节点
te:栈,存放最小生成树的边
{init}
s:=[1];
te.top:=0;
{main}
repeat
min:=maxint;
for i:=1 to n do
for j:=1 to n do
if (i in s) and (not (j in s)) and (graph[i,j]>0) and (graph[i,j]<min) then
begin
min:=graph[i,j];
x:=i;
y:=j;
end;
s:=s+[y];
push(te,x,y);
until te.top=n-1;
8 楼
游侠UFO [专家分:1200] 发布于 2005-10-16 11:24:00
直接选择排序:
for i:=1 to (n-1) do
begin
k:=i;
for j:=(i+1) to n do
if a[j]<a[k] then k:=j; //如果是从大到小排列,则是a[j]>a[k]
x:=a[i];
a[i]:=a[k];
a[k]:=x;
end;
10 楼
绿步甲 [专家分:1610] 发布于 2005-10-16 19:10:00
顶~~~~~~~
我来回复