对拍程序

对拍程序,第1张

如果只是要程序运行的精确时间的乱掘简话。。。

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单步模拟一下吧。

归并:

将数组中的数均分的两部分有序的数归进一个暂时的数组中,从两

部分的起点开始,对当前的两个数比较,哪个小就把哪个送进暂时数组,并

让它在原数组中的下一个数参与下一次比较,直到两部分数全部进入暂时数

组后,将暂时数组的数据覆盖原数组中的数据,使其有序。因为均分的两部

分不一定是有序的,所以要先递归到底,即一个数,在不断回溯时,进行归

并,这时的两部分就是有序的了。

顶堆:

当读入数据时,数据在末尾,这时要不断的向上顶,与它的父亲比较,

直到顶到父亲比自己大或自己在顶点为止,对每一个数据都这样就形成了堆。

压堆:

当最小的数,即堆顶舍弃不用,而需要第二小的数时,就把末尾的数

覆盖到堆顶后向下压,是顶堆的逆过程,即如果叶子比自己小就调换,直到

换不了为止。 *** 作后数据减少一个,但仍是堆。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12419712.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存