关于堆排序(100分)

  • 主题发起人 主题发起人 muyu_21
  • 开始时间 开始时间
M

muyu_21

Unregistered / Unconfirmed
GUEST, unregistred user!
各位:
我想用DELPHI实现堆排序(数据结构里的内部排序)的动态演示,
请问如何在一个圆形区域内放入数据,并能按需更换里面的数据。
请求急救,高分感谢!
 
修改自Delphi的ThrdDemo;

procedure THeapSort.Sort(var A: array of Integer);
var I, Hi, Lo, N, T: Integer;
procedure HeapSwap(AI, AJ: Integer);
begin
T:=A[AI];
A[AI]:=A[AJ];
A[AJ]:=T;
VisualSwap(A[AI], A[AJ], AJ, AI);
end;
procedure PushDown(First, Last: Integer);
var R: Integer;
begin
R:=First;
while R<=(Last div 2)
do if R=Last div 2
then begin
if A[R]<A[R+R] //
then begin
HeapSwap(R, R+R);
end;
R:=Last;
end
else if (A[R]<A[R+R])and(A[R+R]>=A[R+R+1])
then begin
HeapSwap(R, R+R);
R:=R+R;
end
else if (A[R]<A[R+R+1])and(A[R+R+1]>=A[R+R])
then begin
HeapSwap(R, R+R+1);
R:=R+R+1;
end
else R:=Last;
if Terminated then Exit;
end;
begin
Hi:=High(A);
Lo:=Low(A);
N:=Hi-Lo;
for I:=(N div 2)+Lo downto Lo do PushDown(I, N+Lo);
for I:=N+Lo downto 2
do begin
HeapSwap(Lo, I);
PushDown(Lo, I-1);
// VisualSwap(A[Lo], A, I, Lo);
end;
end;
 
用 image 画呀,我原来做的一些数据结构的演示,就是用
image 画,效果不错,

堆排序只是一种特殊情况,每一次有改动,就重新画一次,
主要是定义好大小和位置关系,很简单的。
 
上面的程序有错。 记住堆排序的数组从1开始。
具体程序EMail给你了。

procedure THeapSort.Sort(var A: array of Integer);
var I, Lo, N: Integer;
procedure HeapSwap(AI, AJ: Integer);
var T: Integer;
begin
T:=A[AI];
A[AI]:=A[AJ];
A[AJ]:=T;
VisualSwap(A[AI], A[AJ], AJ, AI);
end;
procedure PushDown(First, Last: Integer);
var R, R2, R21, AR, AR2, AR21: Integer;
begin
R:=First;
while R<=(Last div 2)
do begin
R2:=R+R;
R21:=R2+1;
AR:=A[R];
AR2:=A[R2];
AR21:=A[R21];
if R=Last div 2
then begin
if AR<AR2 then HeapSwap(R, R2);
R:=Last;
end
else if (AR<AR2)and(AR2>=AR21)
then begin
HeapSwap(R, R2);
R:=R2;
end
else if (AR<AR21)and(AR21>=AR2)
then begin
HeapSwap(R, R21);
R:=R21;
end
else R:=Last;
end;
if Terminated then Exit;
end;
begin
Lo:=Low(A);
N:=High(A)-Lo+1;
for I:=(N div 2)+Lo downto Lo do PushDown(I, N+Lo);
for I:=N+Lo downto 2
do begin
HeapSwap(Lo, I);
PushDown(Lo, I-1);
// VisualSwap(A[Lo], A[I-1], Lo, I-1);
end;
end;
 
堆排序不是很难,难的是画出来,我的演示程序大部分是画,
小部分是真正的操作。
 
SuperMMx:
你的回答我能理解,而且基本表示同意,
只不过用IMAGE画好象不行吧,我现在明白该
问题实现不难,但我在具体实现时,碰到很多
问题,很着急。
 
zensst:
首先很感谢你的好意,可惜263免费信箱现在
打不开,另外你的程序(在论坛)有点看不懂。
 
zensst,SuperMMX:
263能用了,自从提问以来,我几天没来论坛,
很抱歉,很快我会给两位分配分数,谢谢两位!
 
怎么不可以?说出来听听。
 
SuperMMX:
我知道在PaintBox和Form 的canvas 可绘图,
在Image中能放入图象,也知道它的canvas属性,
但不知怎么用,请指教,并问哪一个更好。
 
PaintBox 和 Form 的 canvas 可以实时画,但它不负责刷新,
比如最小化以后,再恢复,原来的图就没有了,
而 image 会自动处理重画,它的 canvas 和其他一样,直接画就可以,
但只能对 bmp 进行操作。我个人认为 image 比较可行。(呵呵,现在
也遇到了问题了,我想让一条线闪烁,就是变各种颜色,它总是全部
画完了才显示,这大概就是缺点吧。)
 
收到信了吗?
里面有怎样话的例子。
关于TImage和TPaintBox的区别,我没有仔细看过。好象SuperMMX说的是对的。
一般,除了是图片直接显示外,我都用PaintBox自己画。SuperMMX说的PaintBox
的图象消失问题,我是在OnPaint中处理的。
另外,在例子中,堆排序比快速排序慢许多,主要是,堆排序的画图步骤要多一些,
所以显的慢许多,其实只慢一点,例子中有个CheckBox可以选择是否实时画图。
 
ZENSST:
信收到,RUN后发现FORM有4个PAINTBOX,1个CHECKBOX,
1个STARTSORTING,点击后两者没收到意想效果;可能下载不
完全?你用多线程做的吧,我觉得很简练,可惜我学艺浅薄,
不能完全看懂(特别是多线程);
请简单指点两句,怎样学好DELPHI。
 
在TShape的基础上作一个控件,圆心位置画标号
俺记得有很多可以闪烁的Label控件, 找一个过来修改一下就行了
 
你想象中的效果应是怎样的?
 
zensst:
现在我知道了,你的多线程演示的排序DATA 是
一条条线,LENGTH 不同代表不同的DATA,是不是?
我想的是按图动态显示数据(数字)变化。
 
多人接受答案了。
 
后退
顶部