回 帖 发 新 帖 刷新版面

主题:[原创]常用算法(代码)--陆续增加中

这些几乎都是我平时根据一些书上的算法描述写出来的.
如果有错误的地方,请大家及时提出,以便我及时更改,谢谢!

冒泡排序:
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 楼

树的宽度优先搜索(改进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 楼

快速排序:
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 楼

好,正是我想要的!~谢谢

34 楼

好 啊

35 楼

GOOD!

36 楼

不错
我们一起来贴;
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 楼

另一个算PI的思路:

有点微积分的意思

假设一个边长为a的正六边形.显然它的半径也为a.然后在把它变成半径为a的正12边形,用勾股定理算出其边长,再把它分成正24边形,48边形……正N边行,这时,我们就可以把他看成一个半径为a的圆.假设这时候算出边长为b,则:PI=b*n/(2*a)

据说这是当年祖冲之的算法

至于代码,我原来写过的,不知存哪儿去了,反正挺简单的,可以用递归,也可以用循环

38 楼

没人跟贴了吗?我最近有点忙!
同志们要多多帮忙啊!!!

39 楼

这些有意义吗?你看过基本算法没?上面已经包括了很多有用的算法,我觉得你不用再贴了。

40 楼

我也来个快排把,呵呵
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;

我来回复

您尚未登录,请登录后再回复。点此登录或注册