切换到宽版
  • 64044阅读
  • 111回复

排序 [复制链接]

上一主题 下一主题
离线hanmir
只看该作者 10 发表于: 2005-10-31
版主辛苦了!
离线oierking
只看该作者 11 发表于: 2005-11-02
辛苦辛苦~
离线oierking
只看该作者 12 发表于: 2005-11-02
辛苦辛苦~
离线118140194
只看该作者 13 发表于: 2005-11-02
辛苦辛苦~~
离线byteyang
只看该作者 14 发表于: 2005-11-03
希望能贴几个完整的程序......
离线yuyan
只看该作者 15 发表于: 2005-11-03
请问一下,我的快排有没有写错???望各位指点一二。
const
  maxn=25000;
var
  a:array [1..maxn] of longint;
  i,n:longint;
procedure quicksort(left,right:longint);
  var
    l,r,x:longint;
  begin
    l:=left;r:=right;
    while l<r do
        begin
          while (a[l]<=a[r]) and (l<=r) do
            dec(r);
          x:=a[l];
          a[l]:=a[r];
          a[r]:=x;
          while (a[l]<=a[r]) and (l<=r) do
              inc(l);
          x:=a[l];
          a[l]:=a[r];
          a[r]:=x;
        end;
    if left<=l-1
      then quicksort(left,l-1);
    if l+1<=right
      then quicksort(l+1,right);
  end;
begin
  readln(n);
  for i:=1 to n do
    read(a);
  readln;
  quicksort(1,n);
  for i:=1 to n do
    write(a [ i ],' ');
  writeln;
end.
离线bgq2000
只看该作者 16 发表于: 2005-11-19
唯一遗憾——论坛吃程序
离线youling
只看该作者 17 发表于: 2005-11-27
顶!!!!!!!!!!
离线archimedes

只看该作者 18 发表于: 2005-12-14
太好了!顶~!
离线qswb
只看该作者 19 发表于: 2006-02-12
希尔排序 

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

序列分割方法:将相隔某个增量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.
快速回复
限100 字节
 
上一个 下一个