Image Modal

合肥
合肥奥数网

合肥站
奥数网

信息学竞赛常用算法与策略:排序(4)

合肥奥数网整理 2013-01-17 15:19:01

  4.3希尔排序

  基本思想:将整个无序序列分割成若干小的子序列分别进行插入排序或冒泡排序。

  序列分割方法:将相隔某个增量h的元素构成一个子序列。在排序过程中,逐次减小这个增量,最后当h减到1时,进行一次插入排序或冒泡排序,排序就完成。增量序列一般采用:d1=n div 2 ,di=di-1 div 2 ;i=2,3,4.....其中n为待排序序列的长度。

  程序1:(子序列是插入排序)

  program xepx;

  const n=7;

  type

  arr=array[1..n] of integer;

  var

  a:arr;

  i,j,t,d:integer;

  bool:boolean;

  begin

  write('input data:');

  for i:=1 to n do read(a[i]);

  writeln;

  d:=n;

  while d>1 do

  begin

  d:=d div 2;

  for j:=d+1 to n do

  begin

  t:=a[j];i:=j-d;

  while (i>0) and (a[i]>t) do

  begin a[i+d]:=a[i];i:=i-d;end;

  a[i+d]:=t;

  end;

  end;

  write('output data:');

  for i:=1 to n do write(a[i]:6);

  writeln;

  end.

  程序2:(子序列是冒泡排序)

  program xepx;

  const n=7;

  type

  arr=array[1..n] of integer;

  var

  a:arr;

  i,temp,d:integer;

  bool:boolean;

  begin

  write('input data:');

  for i:=1 to n do read(a[i]);

  writeln;

  d:=n

  while d>1 do

  begin

  d:=d div 2;

  repeat

  bool:=true;

  for i:=1 to n-d do

  if a[i]>a[i+d] then

  begin temp:=a[i];a[i]:=a[i+d];a[i+d]:=temp; bool:=false end;

  until bool;

  end;

  write('output data:');

  for i:=1 to n do write(a[i]:6);

  writeln;

  end.

首页 上一页 下一页 尾页

相关推荐

点击查看更多
重点初中
首页 导航