直接插入排序算法

unit SortUnit;

interface

const n = 8; //待排序的记录数

type   //定义记录(数据元素)的结构:关键字为数据域key   rcdtype = record key: integer; name: string;             end;   //定义待排序的序列:有n个记录   listtype = array[0..n] of rcdtype;

procedure straipass ( var r: listtype; i: integer );

procedure straisort ( var r: listtype ); procedure straisort1 ( var r: listtype );

implementation

//一趟直接插入排序的算法

procedure straipass ( var r: listtype; i: integer );

var j: integer;

begin      

r[0]:= r[i];      

j:=i-1;      

  while r[j].key > r[0].key do

  begin           

    r[j+1]:= r[j];           

    j:= j-1;      

  end;     

   r[j+1]:= r[0];

end;

//整个排序过程为进行n-1趟插入

procedure straisort ( var r: listtype );

var i: integer;

begin      

    for i:= 2 to n do            

      straipass(r,i);

 end;

//将上面两个过程合并为一个的直接插入排序的算法

procedure straisort1 ( var r: listtype );

var i,j: integer;

begin      

       for i:= 2 to n do

       begin  //从第2个记录逐个进行插入            

            r[0]:= r[i];   //r[0]为监视哨,存放待插入的记录r[i]            

            j:=i-1;        //从i-1起往前搜索            

           while r[j].key > r[0].key do

           begin                  

               r[j+1]:= r[j];  //后移第i-1,i-2,...个记录,直到某个r[j]的关键字小于r[i]                  

              j:= j-1;        //向前取下一个记录            

               end;            

              r[j+1]:= r[0];  //以r[i]的值替换当前比较的r[j]后面那个记录r[j+1]的值     

        end;

       end;

end.

//======================================================

//上面算法的具体调用例子:用Delphi 2005实现的控制台程序,编译后为first.exe

program first;

{$APPTYPE CONSOLE}

uses       SysUtils,       SortUnit in 'SortUnit.pas';

var      

r: listtype;      

i: integer;

begin      

       Writeln('随机产生'+IntToStr(n)+'组值:');      

        Randomize();      

         for i:= 1 to n do begin            

             r[i].key := Random(100);            

             Write(r[i].key,' ');      

         end;      

           Writeln('');      

          straisort1(r);     

            Writeln('直接插入排序后得到:');     

            for i:= 1 to n do           

         Write( r[i].key,' ' );

end.

//============================================

//下面是例子的输出结果

C:\Delphi2005\first>first.exe 随机产生8组值: 4 47 93 89 87 88 6 90 直接插入排序后得到: 4 6 47 87 88 89 90 93 C:\Delphi2005\first>

 

posted @ 2012-09-03 22:34  坚持Delphi  阅读(425)  评论(0编辑  收藏  举报