一、 排序算法
1.1 选择算法
选择排序是一种简单而有效的排序算法,在问题规模不是很大的情况下就大胆的使用这个算法吧。
  算法主过程如下:

  PROCEDURE selectsort;
      VAR
        i,j,k,temp:integer;
      BEGIN
        FOR i:=1 to n-1 DO
          BEGIN
            k:=i;
            FOR j:=i+1 to n DO
              IF a[k]>a[j]
                THEN k:=j;
          IF k<>i
            THEN BEGIN
                    temp:=a[k];
                    a[k]:=a[i];
                    a[i]:=temp;
                  END;
          END;
      END;
1.2快速排序
快速排序是基于分治排序算法,在数据规模很大的情况下一般使用该算法。
  算法主过程如下:

    procedure qsort(L,R:longint);
      var
        i,j,mid,temp:longint;
      begin
          i:=L;
          j:=R;
          mid:=a[L+random(R-L+1)];  {随机选择一个数组中的数作为对比数}
          repeat
              while a[i]< mid do inc(i);    {在左半部分寻比中间数大的数}
              while mid< a[j] do dec(j);    {在右半部分寻比中间数小的数}
              if i< =j then    {若到一组与排序目标不一致的数对则交换它们}
                begin
                  temp:=a[i];
                  a[i]):=a[j];
                  a[j]:=temp;
                  inc(i);dec(j); {继续}
                end;
            until i >j;
            if L< j then qsort(L,j);  {若未到两个数的边界,则递归搜索左右区间}
            if i< R then qsort(i,R);
        end;

    注意:主程序中必须加randomize语句。
二、 高精度算法
1.2 存储方法
      由于待处理的数据超过了任何一种数据类型所能容纳的范围,因此必须采用数串形式输入,并将其转化为数组。该数组的每一个元素对应一个十进制数,由其下标顺序指明位序号。由于高精度运算可能使得数据长度发生变化,因此除要用整数数组存储数据外,还需要一个整数变量纪录整数数组的元素个数,即数据的实际长度。
type
  numtype=array[1..255] of byte;
var
  a:numtype;
  la:byte; 
  s:string;
begin
  readln(s);
  la:=length(s);
  for i:=1 to la do
    a[la-i+1]:=ord(s[i])-ord('0');
end.
1.3 加法运算
  高精度加法运算
  首先,确定ab中的最大位数x,然后依照由低位至高位的顺序进行加法运算。在每一次运算中,a当前位加b当前位的和除以10,其整商即为进位,其余数即为和的当前位。在进行了x位的加法后,若最高位有进位(a[x+1]<>0),则a的长度为x+1
以下只列出关键程序:
type
  numtype=array[1..255] of word;
var
  a,b,s:numtype;
  la,lb,ls:word; 
procedure plus(var a:numtype;var la:word;b:numtype;lb:word);  {利用过程实现}
  var
    i,x:word;
  begin
    if la>=lb
      then x:=la
      else x:=lb;
    for i:=1 to x do
      begin
        a[i]:=a[i]+b[i];
        a[i+1]:=a[i+1]+a[i] div 10;
        a[i]:=a[i] mod 10;
      end;
   while a[x+1]<>0 do
      x:=x+1;   
  la:=x;            {最高位若有进位,则长度增加}
  end;
1.4 减法运算
     
字符串长度排序高精度减法运算(a>b
    依照由低位至高位的顺序进行减法运算。在每一次位运算中,若出现不够减的情况,则向高位借位。在进行了la位的减法后,若最高位为零,则a的长度减1
以下只列出关键程序:
type
  numtype=array[1..255] of longint;
var
  a,b:numtype;
  la,lb:word; 
procedure minus(var a:numtype;var la:word;b:numtype;);
  var
    i:word;
  begin
    for i:=1 to la do
      begin
        if a[i]<b[i]
          then begin
                  dec(a[i+1]);
                  a[i]:=a[i]+10;
                end;
        a[i]:=a[i]-b[i];
      end;
    while (a[la]=0) and (la>1) do
      dec(la);
  end;
© 版权所有 桐乡市高级中学计算机组 王建献 2005- 2011
制作与维护:桐高计算机组 王建献 邮箱:omnislash2000@163
建议使用:800*600分辨率,IE5.0以上版本浏览器
1.5 乘法运算
 高精度乘法运算
  按照乘法规则,从a的第1位开始逐位与cc为字节型)相乘。在第i位乘法运算中,ai位与c的乘积必须加上i-1位的进位,然后规整积的i-1位。
以下只列出关键程序:
type
  numtype=array[1..1000] of word;
var
  a:numtype;
  la:word; 
procedure multiply(var a:numtype;var la:word;c:word);
  var
    i:word;
  begin
    a[1]:=a[1]*c;
    for i:=2 to la do
      begin
        a[i]:=a[i]*c;
        a[i]:=a[i]+a[i-1] div 10;
        a[i-1]:=a[i-1] mod 10;
      end;
    while a[la]>=10 do
      begin
      inc(la);
      a[la]:=a[la-1] div 10;
      a[la-1]:=a[la-1] mod 10;
      end;
  end;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。