CodeVS1076排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeVS1076排序相关的知识,希望对你有一定的参考价值。

Description

给出n和n个整数,希望你从小到大给他们排序

Input

第一行一个正整数n

第二行n个用空格隔开的整数

Output

输出仅一行,从小到大输出n个用空格隔开的整数

Sample Input

3

3 1 2

Sample Output

1 2 3

Hint

1<=n<=100000

Solution

大材小用,Heap模板

 1 var
 2   f:array [1..1000000] of longint;
 3   a,i,n,len:longint;
 4 
 5 procedure swap(var a,b:longint);
 6 var x:longint;
 7 begin
 8   x:=a;a:=b;b:=x;
 9 end;
10 
11 procedure insert(a:longint);
12 var
13   x:longint;
14 begin
15   inc(len); f[len]:=a; x:=len;
16   while (x>>1>0) and (f[x>>1]>f[x]) do
17     begin
18       swap(f[x],f[x>>1]); x:=x>>1;
19     end;
20 end;
21 
22 function get:longint;
23 var
24   x:longint;
25 begin
26   get:=f[1]; f[1]:=f[len]; dec(len); x:=1;
27   while (x<<1<=len) and ((f[x<<1]<f[x]) or (f[x]>f[x<<1+1])) do
28     begin
29       if (f[x<<1]<f[x<<1+1]) or (x<<1=len)
30         then begin swap(f[x],f[x<<1]);x:=x<<1; end
31         else begin swap(f[x],f[x<<1+1]);x:=x<<1+1; end;
32     end;
33 end;
34 
35 begin
36   readln(n);
37   len:=0;
38   for i:=1 to n do
39     begin
40       read(a);
41       insert(a);
42     end;
43 
44   for i:=1 to n do
45     write(get,);
46   writeln;
47 end.


学长写的模板

 1 var
 2   a,h:array[0..100001]of longint;
 3   i,n,x,t,tmp:longint;
 4 
 5 procedure put(x:longint);
 6 var
 7   now:longint;
 8 begin
 9   inc(t); h[t]:=x; now:=t;
10   while (now<>1)and(h[now]<h[now >> 1]) do
11     begin
12       tmp:=h[now]; h[now]:=h[now >> 1];
13       h[now >> 1]:=tmp; now:=now >> 1;
14     end;
15 end;
16 
17 function get:longint;
18 var
19   fa,son,now:longint;
20 begin
21   get:=h[1]; h[1]:=h[t]; dec(t);
22   fa:=1;
23   while fa << 1<=t do
24     begin
25       if (fa << 1=t)or(h[fa << 1]<h[fa << 1+1])
26         then son:=fa << 1 else son:=fa << 1+1;
27       if h[son]>h[fa] then break;
28       tmp:=h[fa]; h[fa]:=h[son];
29       h[son]:=tmp; fa:=son;
30     end;
31 end;
32 
33 begin
34   readln(n);
35   for i:=1 to n do
36     begin read(x); put(x); end;
37   for i:=1 to n do write(get, );
38   writeln;
39 end.

 

以上是关于CodeVS1076排序的主要内容,如果未能解决你的问题,请参考以下文章

1076 排序

1076 排序

codevs1170 双栈排序

codevs 1170 双栈排序

CODEVS 1214

codevs 1487 大批整数排序