直接插入排序算法
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>