?? fto3.~pas
字號(hào):
a[i+1]:=x; flag:=1; v:=v+3;
end;
c:=c+1;
end;
k:=k-1;
end;
display;
end;
procedure TForm1.Button14Click(Sender: TObject);
//順序選數(shù)。
begin
spinedit1.Value:=1;
spinedit2.Value:=2;
spinedit3.Value:=3;
spinedit4.Value:=4;
spinedit5.Value:=5;
spinedit6.Value:=6;
spinedit7.Value:=7;
spinedit8.Value:=8;
spinedit9.Value:=9;
spinedit10.Value:=10;
end;
procedure TForm1.Button15Click(Sender: TObject);
//逆序選數(shù)。
begin
spinedit1.Value:=10;
spinedit2.Value:=9;
spinedit3.Value:=8;
spinedit4.Value:=7;
spinedit5.Value:=6;
spinedit6.Value:=5;
spinedit7.Value:=4;
spinedit8.Value:=3;
spinedit9.Value:=2;
spinedit10.Value:=1;
end;
procedure TForm1.partition(t,h:integer);
//快速排序的劃分過(guò)程。
var x,i,j,k:integer;
begin
if t<h then
begin
i:=t;
j:=h;
x:=a[t];
repeat
while (a[j]>=x) and (i<j) do
begin j:=j-1; c:=c+1; end;
c:=c+1;
if i<j then begin a[i]:=a[j]; i:=i+1; v:=v+1; end;
while (a[i]<x) and (i<j) do
begin i:=i+1; c:=c+1; end;
c:=c+1;
if i<j then begin a[j]:=a[i]; j:=j-1; v:=v+1; end;
until i=j;
a[i]:=x; v:=v+1;
partition(t,i-1);
partition(i+1,h);
end;
end;
procedure TForm1.Button8Click(Sender: TObject);
//交換排序(快速排序)
begin
ina;
partition(1,n);
display;
end;
procedure TForm1.Button13Click(Sender: TObject);
//簡(jiǎn)單選擇排序
var i,j,k,x:integer;
begin
ina;
for j:=n downto 2 do
begin
k:=1;
for i:=2 to j do
begin
if a[i]>a[k] then k:=i;
c:=c+1;
end;
x:=a[j];
a[j]:=a[k];
a[k]:=x; v:=v+3;
end;
display;
end;
procedure TForm1.heapfy1(i,j:integer);
//重新堆化過(guò)程(用遞歸實(shí)現(xiàn))。
var x,k:integer;
begin
if 2*i<=j then
begin
k:=2*i;
if ((k+1)<=j) and (a[k]<a[k+1]) then
k:=2*i+1;
c:=c+1;
if a[i]<a[k] then
begin
x:=a[k];
a[k]:=a[i];
a[i]:=x; v:=v+3;
end;
c:=c+1;
heapfy1(k,j);
end;
end;
procedure TForm1.heapfy2(i,j:integer);
//重新堆化過(guò)程(用循環(huán)實(shí)現(xiàn))。
var x,k:integer;
begin
while 2*i<=j do
begin
k:=2*i;
if ((k+1)<=j) and (a[k]<a[k+1]) then
k:=2*i+1;
c:=c+1;
if a[i]<a[k] then
begin
x:=a[k];
a[k]:=a[i];
a[i]:=x; v:=v+3;
end;
c:=c+1;
i:=k;
end;
end;
procedure TForm1.Button10Click(Sender: TObject);
//遞歸堆排序。
var i,j,k,x:integer;
begin
ina;
k:=n div 2;
for i:=k downto 1 do
heapfy1(i,n);
for j:=n downto 2 do
begin
x:=a[1];
a[1]:=a[j];
a[j]:=x; v:=v+3;
heapfy1(1,j-1);
end;
display;
end;
procedure TForm1.Button16Click(Sender: TObject);
//循環(huán)堆排序。
var i,j,k,x:integer;
begin
ina;
k:=n div 2;
for i:=k downto 1 do
heapfy2(i,n);
for j:=n downto 2 do
begin
x:=a[1];
a[1]:=a[j];
a[j]:=x; v:=v+3;
heapfy2(1,j-1);
end;
display;
end;
procedure TForm1.Button17Click(Sender: TObject);
{改進(jìn)的重新堆化過(guò)程。其主要思想是:刪除根元素之后(實(shí)際上
是用x:=a[1]將根暫存在變量x中),通過(guò)一次比較,把兩個(gè)子堆
根之最大者上升為堆之根,那個(gè)缺少根的子堆又將被分成兩個(gè)子堆
,重復(fù)上述合并過(guò)程,直至某葉的上一層,把原堆最后一片葉所存
的元素放入這個(gè)缺少元素的葉之處,這個(gè)葉可能會(huì)上升,可逐一與
其祖先比較,為其找至適當(dāng)?shù)奈恢茫可仙淮沃蛔饕淮伪容^,通
常可在少數(shù)幾步內(nèi)找到它的應(yīng)在的位置,最壞情況下至多上升至第
二層。最后把原堆根元素入在最后一片葉的位置上(a[j]:=x)這
樣便完成了一次循環(huán)。}
var i,j,x,k:integer;
begin
ina;
k:=n div 2;
for i:=k downto 1 do
heapfy2(i,n);
for j:=n downto 2 do
begin
x:=a[1]; v:=v+1;
i:=1;
while 2*i<=j do
begin
k:=2*i;
if ((k+1)<=j) and (a[k]<a[k+1]) then
k:=2*i+1;
c:=c+1;
a[i]:=a[k]; v:=v+1;
i:=k;
end;
k:=i div 2;
while a[k]<a[j] do
begin
c:=c+1;
a[i]:=a[k]; v:=v+1;
i:=k;
k:=i div 2;
end;
c:=c+1;
a[i]:=a[j];
a[j]:=x; v:=v+2;
end;
display;
end;
procedure Tform1.merge(p,q,r:integer;var a,b:arr);
//將a中相臨兩有序段,下標(biāo)從p至q,從q+1至r,
//合并成一個(gè)有序段到b中,下面的i,j分別表示兩有序段之首,
//e是一個(gè)全局變量,它b中的移入位置。
var i,j:integer;
begin
i:=p;
j:=q+1;
e:=p;
while (i<=q) and (j<=r) do
begin
if a[i]<=a[j] then begin b[e]:=a[i]; i:=i+1; end
else begin b[e]:=a[j]; j:=j+1; end;
e:=e+1;
end;
if i>q then move(j,r,a,b);
if j>r then move(i,q,a,b);
end;
procedure Tform1.move(i,j:integer;var a,b:arr);
var k:integer;
begin
for k:=0 to (j-i) do
b[e+k]:=a[i+k];
end;
procedure Tform1.scan(l:integer;var a,b:arr);
var i,j,k:integer;
begin
i:=1;
while i<=n do
begin
j:=i+l-1;
k:=j+l;
if j>n then i:=n;
if k>n then k:=n;
merge(i,j,k,a,b);
i:=k+1;
end;
end;
procedure TForm1.Button11Click(Sender: TObject);
var i,l:integer;
c,d:arr;
begin
ina;
for i:=1 to n do
begin
c[i]:=a[i];
d[i]:=0;
end;
l:=1;
while l<n do
begin
scan(l,c,d);
scan(2*l,d,c);
l:=4*l;
end;
for i:=1 to n do
a[i]:=c[i];
display;
end;
procedure TForm1.Button18Click(Sender: TObject);
begin
Randomize;
spinedit1.Value:=(random(9)+1)*100+random(100);
spinedit2.Value:=(random(9)+1)*100+random(100);
spinedit3.Value:=(random(9)+1)*100+random(100);
spinedit4.Value:=(random(9)+1)*100+random(100);
spinedit5.Value:=(random(9)+1)*100+random(100);
spinedit6.Value:=(random(9)+1)*100+random(100);
spinedit7.Value:=(random(9)+1)*100+random(100);
spinedit8.Value:=(random(9)+1)*100+random(100);
spinedit9.Value:=(random(9)+1)*100+random(100);
spinedit10.Value:=(random(9)+1)*100+random(100);
spinedit11.Value:=(random(9)+1)*100+random(100);
end;
procedure TForm1.Button12Click(Sender: TObject);
//基數(shù)排序。
var p,q:pointer;
i,j,m,k,l,r:integer;
h,t:array [0..9] of pointer;
begin
ina;
q:=nil;
for i:=n downto 1 do
begin
new(p);
p^.a[1]:=(a[i] div 100);
p^.a[2]:=((a[i] mod 100) div 10);
p^.a[3]:=(a[i] mod 10);
p^.next:=q;
q:=p;
end;
m:=10; //m=10表示每位上數(shù)的范圍為0~9)。
k:=3;
//以上構(gòu)造將排序的隊(duì)列及變量初始化。
for j:=k downto 1 do //依次對(duì)個(gè)位、十位、百位進(jìn)行分組。
begin
for i:=0 to m-1 do
h[i]:=nil;
while p<>nil do
begin
l:=p^.a[j];
if h[l]=nil then
h[l]:=p
else
t[l]^.next:=p;
t[l]:=p;
p:=p^.next;
end;
r:=0;
while h[r]=nil do
r:=r+1;
p:=h[r];
q:=t[r];
for i:=r+1 to m-1 do
if h[i]<>nil then
begin
q^.next:=h[i];
q:=t[i];
end;
q^.next:=nil;
end;
for i:=1 to n do
begin
a[i]:=10*(10*p^.a[1]+p^.a[2])+p^.a[3];;
q:=p;
p:=p^.next;
dispose(q);
end;
display;
end;
procedure TForm1.N24Click(Sender: TObject);
begin
showmessage('雷新鋒二OO二年十二月于通院!');
end;
procedure TForm1.N26Click(Sender: TObject);
begin
close;
end;
end.
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -