program extim
uses sysutils {FP的系统单元}
var tt:tdatetime{时间类型,Tdatetime是一个双精度的浮点数,如果 tt = 234.567就表示234.567天,当然是从公元0年开始计算哗裤的}
Begin
{读入数据}
tt:=now*86400{now是系统函数,返回当前天数,*86400s/天就是秒数散氏了}
{这里是你的主程序}
tt:=now*86400-tt
writeln(tt:0:8){程序运行秒数}
readln
END.
顺便,比赛交程序时可不要写这些。
我写的是根比叶子大的堆,siftup 是顶堆(就是新来的数据向上,直到它的父亲比自己大,或自己是
堆的根)
程序是对输入数据边读边排虚尺的:
program duipai
var
a:array[1..100000]of longint
n:longint
procedure siftup(i:longint)
var
j,b:longint
begin
b:=a[i]
while i>野大1 do
begin
j:=i shr 1
if a[j]<b then
begin
a[i]:=a[j]
i:=j
end
else break
end
a[i]:=b
end
procedure init
begin
assign(input,'a.in')reset(input)
n:=1
while not seekeof do
begin
read(a[n])
siftup(n)
inc(n)
end
dec(n)
close(input)
end
procedure ansit
var
i:longint
begin
for i:=1 to n do write(a[i],' ')writeln
end
begin
init
ansit
end.
下面的是把最下面的叶子放到堆根上再向下压的程序:
procedure siftdown
var
b,i,j:longint
begin
b:=a[1]i:=1
while i<=n do
begin
j:=i*2
if j>n then break
if (j<n)and(a[j+1]>a[j])then inc(j)
if a[j]>b then
begin
a[i]:=a[j]i:=j
end
else break
end
a[i]:=b
end
如果要改变堆中数据大小顺序,只要改变a[]与b 的比较符号即可
这是快排:
procedure sort(l,r:longint)
var
i,j,t,temp:longint
begin
i:=lj:=rtemp:=a[(i+j)shr 1]
while i<=j do
begin
while a[j]>temp do dec(j)
while a[i]<颂誉竖temp do inc(i)
if i<=j then
begin
t:=a[i]a[i]:=a[j]a[j]:=t
inc(i)dec(j)
end
end
if l<j then sort(l,j)
if i<r then sort(i,r)
end
这是归并排序:
program guibing
var
a,temp:array[1..100000]of longint
n:longint
procedure init
begin
assign(input,'a.in')reset(input)
n:=1
while not eof do
begin read(a[n])inc(n)end
dec(n)
close(input)
end
procedure sort(l,r:longint)
var
i,j,p,mid:longint
begin
if l=r then exit
mid:=(l+r)shr 1
sort(l,mid)
sort(mid+1,r)
i:=lj:=mid+1p:=l
while (i<=mid)or(j<=r)do
begin
if (i<=mid)and(j<=r)then
begin
if a[i]<a[j] then
begin temp[p]:=a[i]inc(i)end
else begin temp[p]:=a[j]inc(j)end
end
else
begin
if i<=mid then begin temp[p]:=a[i]inc(i)end
else begin temp[p]:=a[j]inc(j)end
end
inc(p)
end
for i:=l to r do a[i]:=temp[i]
end
procedure ansit
var
i:longint
begin
for i:=1 to n do write(a[i],' ')writeln
end
begin
init
sort(1,n)
ansit
end.
压堆是为了删掉最上面的根再找到新的最大的根而用的,
如果初始状态不是已经排好的根堆,压堆不会使其成为
一个根堆,而顶堆 *** 作则可生成堆.
我的哪个程序有错?
你需要哪个排序的解释?
快排:
在数组中找一个数,使它左边的数都小于它,右边的数都大于它,并找
到这个数的位置,明显是把整个数组排好序后的位置(记为mid).。再更深一层的
递归,即sort(l,mid-1)sort(mid+1)对这个数左右两边的数再排序,道理一
样,直到处理的数只剩下一个。具体实现你自己F7单步模拟一下吧。
归并:
将数组中的数均分的两部分有序的数归进一个暂时的数组中,从两
部分的起点开始,对当前的两个数比较,哪个小就把哪个送进暂时数组,并
让它在原数组中的下一个数参与下一次比较,直到两部分数全部进入暂时数
组后,将暂时数组的数据覆盖原数组中的数据,使其有序。因为均分的两部
分不一定是有序的,所以要先递归到底,即一个数,在不断回溯时,进行归
并,这时的两部分就是有序的了。
顶堆:
当读入数据时,数据在末尾,这时要不断的向上顶,与它的父亲比较,
直到顶到父亲比自己大或自己在顶点为止,对每一个数据都这样就形成了堆。
压堆:
当最小的数,即堆顶舍弃不用,而需要第二小的数时,就把末尾的数
覆盖到堆顶后向下压,是顶堆的逆过程,即如果叶子比自己小就调换,直到
换不了为止。 *** 作后数据减少一个,但仍是堆。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)