希尔排序 
基本思想:将整个无序序列分割成若干小的子序列分别进行插入排序或冒泡排序。
序列分割方法:将相隔某个增量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);
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>t) do
       begin a[i+d]:=a;i:=i-d;end;
    a[i+d]:=t;
    end;
 end;
 write('output data:');
for i:=1 to n do write(a: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);
writeln;
d:=n
while d>1 do
 begin
  d:=d div 2;
  repeat
   bool:=true;
   for i:=1 to n-d do
     if a>a[i+d] then
     begin temp:=a;a:=a[i+d];a[i+d]:=temp; bool:=false end;
  until bool;
 end;
write('output data:');
for i:=1 to n do write(a:6);
writeln;
end.
堆排序与二叉树排序
1.堆排序
堆:设有数据元素的集合(R1,R2,R3,...Rn)它们是一棵顺序二叉树的结点且有
       Ri<=R2i 和Ri<=R2i+1(或>=)
堆的性质:堆的根结点上的元素是堆中的最小元素,且堆的每一条路径上的元素都是有序的。
堆排序的思想是:
1)建初始堆(将结点[n/2],[ n/2]-1,...3,2,1分别调成堆)
2)当未排序完时
 输出堆顶元素,删除堆顶元素,将剩余的元素重新建堆。
程序如下:
program duipx;
const n=8;
type arr=array[1..n] of integer;
var a:arr;i:integer;
procedure sift(var a:arr;l,m:integer);
 var i,j, t:integer;
 begin
 i:=l;j:=2*i;t:=a;
 while j<=m do
  begin
   if (j<m) and (a[j]>a[j+1]) then j:=j+1;
   if t>a[j] then
      begin a:=a[j];i:=j;j:=2*i; end
             else exit;
  a:=t;
 end;
end;
begin
 for i:=1 to n do read(a);
 for i:=(n div 2) downto 1 do
  sift(a,i,n);
 for i:=n downto 2 do
  begin
  write(a[1]:4);
  a[1]:=a;
  sift(a,1,i-1);
  end;
  writeln(a[1]:4);
end.
二叉树排序
排序二叉树:每一个参加排列的数据对应二叉树的一个结点,且任一结点如果有左(右)子树,则左(右)子树各结点的数据必须小(大)于该结点的数据。中序遍历排序二叉树即得排序结果。程序如下:
program pxtree;
const
 a:array[1..8] of integer=(10,18,3,8,12,2,7,3);
type point=^nod;
     nod=record
     w:integer;
     right,left:point ;
     end;
 var root,first:point;k:boolean;i:integer;
 procedure hyt(d:integer;var p:point);
 begin
  if p=nil then
   begin
    new(p);
    with p^ do begin w:=d;right:=nil;left:=nil end;
    if k then begin root:=p; k:=false end;
   end
  else with p^ do if d>=w then hyt(d,right) else hyt(d,left);
 end;
procedure hyt1(p:point);
 begin
  with p^ do
   begin
    if left<>nil then hyt1(left);
    write(w:4);
    if right<>nil then hyt1(right);
   end
end;
begin
 first:=nil;k:=true;
 for i:=1 to 8 do hyt(a,first);
 hyt1(root);writeln;
end.