主题:[原创]常用算法(代码)--陆续增加中
游侠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个回复)
31 楼
游侠UFO [专家分:1200] 发布于 2005-11-04 13:28:00
树的宽度优先搜索(改进1):
procedure widesearch(tree:treetype; root:integer);
var
team:teamtype;
i,x:integer;
begin
team.head:=1;
team.tail:=1;
team.data[1]:=root;
while team.head<=team.tail do
begin
x:=team.data[team.head];
team.head:=team.head+1;
访问节点x(tree[x].data);
for i:=1 to tree[x].degree do
begin
team.tail:=team.tail+1;
team.data[team.tail]:=tree[x].child[i];
end;
end;
end;
32 楼
游侠UFO [专家分:1200] 发布于 2005-11-08 13:07:00
快速排序:
procedure sort(var a:arraytyp; l,r:integer);
var
i,j,mid,k:integer;
begin
i:=l;
j:=r;
mid:=a[(l+r) div 2];
repeat
while a[i]<mid do i:=i+1; //如果是降序,则是a[i]>mid
while mid<a[j] do j:=j-1; //如果是降序,则是mid>a[j]
if i<=j then
begin
k:=a[i];
a[i]:=a[j];
a[j]:=k;
i:=i+1;
j:=j-1;
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end;
33 楼
zhuyidong [专家分:0] 发布于 2005-12-25 10:27:00
好,正是我想要的!~谢谢
34 楼
zgl [专家分:20] 发布于 2005-12-25 13:41:00
好 啊
35 楼
HarryPotter [专家分:20] 发布于 2005-12-28 20:10:00
GOOD!
36 楼
goal00001111 [专家分:4030] 发布于 2005-12-31 15:07:00
不错
我们一起来贴;
PROGRAM MakePi (input, output);
{利用随机数函数计算Pi的值。将随机数的前后两个值(均在0-1之间)作为点的x,y坐标。
统计10000个点中,落入半径为1的四分之一圆内的点数n,从而计算出四分之一圆的面积s
(s=n/10000)。又知四分之一圆的面积为Pi*r2/4 = Pi/4,由此即可算出Pi的值}
CONST
MAX = 10000;
VAR
i, n : integer;
Pi, s, seed, x, y: real;
{产生随机数的函数说明}
FUNCTION rand(VAR seed: real): real;
CONST
a = 93.0;
m = 8192.0;
c = 1.0;
BEGIN
seed:= a * seed + c;
seed:= round((seed/m - trunc(seed/m))*m);
rand:= seed/m
END;
BEGIN {主程序}
seed:= 0.7823; n:= 0;
FOR i:=1 TO MAX DO
BEGIN
x:= rand(seed);
y:= rand(seed);
IF x*x + y*y <= 1
THEN n:= n+1
END;
s:= n/MAX;
Pi:= 4*s;
writeln('Pi=', Pi)
END.
37 楼
游侠UFO [专家分:1200] 发布于 2006-01-01 23:30:00
另一个算PI的思路:
有点微积分的意思
假设一个边长为a的正六边形.显然它的半径也为a.然后在把它变成半径为a的正12边形,用勾股定理算出其边长,再把它分成正24边形,48边形……正N边行,这时,我们就可以把他看成一个半径为a的圆.假设这时候算出边长为b,则:PI=b*n/(2*a)
据说这是当年祖冲之的算法
至于代码,我原来写过的,不知存哪儿去了,反正挺简单的,可以用递归,也可以用循环
38 楼
游侠UFO [专家分:1200] 发布于 2006-02-06 13:45:00
没人跟贴了吗?我最近有点忙!
同志们要多多帮忙啊!!!
39 楼
scyangbo [专家分:360] 发布于 2006-02-06 16:00:00
这些有意义吗?你看过基本算法没?上面已经包括了很多有用的算法,我觉得你不用再贴了。
40 楼
贺天行宝 [专家分:2300] 发布于 2006-02-07 10:15:00
我也来个快排把,呵呵
var a:array[1..100]of integer;
procedure qsort(l,r:integer);
var
i,j,x:integer;
begin
if l>=r then exit;
i:=l;j:=r;x:=a[i];
repeat
while (a[j]>=x)and(i<j) do dec(j);
if (a[j]<x)and(i<j) then begin a[i]:=a[j]; inc(i); end;
while (a[i]<=x)and(i<j) do inc(i);
if (a[i]>x)and(i<j) then begin a[j]:=a[i]; dec(j); end;
until i=j;
a[i]:=x;
qsort(l,i);qsort(i+1,r);
end;
我来回复