誰有pascal堆排序的原程式以及詳細的註釋

2025-07-14 06:45:18 字數 3545 閱讀 5925

1樓:網友

var a:array[0..400000]of longint;

i,n:longint;

procedure headup(v:longint);

var t:longint;

beginif (v>1)and(a[v]begint:=a[v]; a[v]:=a[v div 2]; a[v div 2]:=t;

headup(v div 2);

end;end;

procedure headdown(v:longint);

var t:longint;

beginif (v*2<=i-1) then

beginif (v*2beginif a[v*2]beginif a[v*2+1]beginif a[v*2]《凳缺a[v*2+1] then

begint:=a[v];a[v]:=a[v*2]; a[v*2]:=t;

headdown(v*2);

endelse

begint:=a[v];a[v]:=a[v*2+1]; a[v*2+1]:=t;

headdown(v*2+1);

end;end

elsebegin

t:=a[v];a[v]:=a[v*2]; a[v*2]:=t;

headdown(v*2);

end;end

elseif a[v*2+1]《棗爛辯a[v] then

begint:=a[v];a[v]:=a[v*2+1]; a[v*2+1]:=t;

headdown(v*2+1);

end;end

elseif a[v*2]《歷空a[v] then

begint:=a[v];a[v]:=a[v*2]; a[v*2]:=t;

headdown(v*2);

end;end;

end;begin

readln(n);

for i:=1 to n do

beginread(a[i]);

headup(i);

end;for i:=n downto 1 do

beginwrite(a[1],'

a[1]:=a[i];

headdown(1);

end;end.

兩個子程式,headup為建樹,headdown為維護和輸出。

2樓:

堆排序。堆:設有資料元素的集合(冊汪r1,r2,r3,..rn)它們是一棵順序二叉樹的結點且有。

ri<=r2i 和ri<=r2i+1(或》=)

堆的性質拆譽:堆的根結點上的元素是堆中的最小元素,且堆的每一條路徑上的元素都是有序的。

堆排序的思想是:

1)建初始堆(將結點[n/2],[n/2]-1,..3,2,1分別調成堆)

2)當未排序完時。

輸出堆頂元素,刪除堆頂元素,將剩餘的元旅姿段素重新建堆。

程式如下:program duipx;

const n=8;

type arr=array[1..n] of integer;

var a:arr;i:integer;

procedure sift(var a:arr;l,m:integer);

var i,j, t:integer;

begini:=l;j:=2*i;t:=a[i];

while j<=m do

beginif (ja[j+1]) then j:=j+1;

if t>a[j] then

begin a[i]:=a[j];i:=j;j:=2*i; end

else exit;

a[i]:=t;

end;end;

beginfor i:=1 to n do read(a[i]);

for i:=(n div 2) downto 1 do

sift(a,i,n);

for i:=n downto 2 do

beginwrite(a[1]:4);

a[1]:=a[i];

sift(a,1,i-1);

end;writeln(a[1]:4);

end.

3樓:

關於堆的定義就不說了,想必你也明白……堆排就是用二叉堆排序。

varnum:array[1..2000]of longint;

i,j,n:integer;

procedure change(var a,b:longint);

vark:longint;

begink:=a;

a:=b;b:=k;

end;begin

readln(n);

for i:=1 to n do

read(num[i]);

for i:=n downto 2 do

beginfor j:=i downto 2 doif num[j]>num[j div 2] then change(num[j div 2],num[j]);

在陣列中第j個元素的完全二叉樹父節點的下標就是j div 2,如果它的肢圓值比父節點大,就交換兩個數,使其唯飢租保持上大下小的結構特點}

change(num[i],num[1]);

end;for i:=1 to n do

write(num[i],'

end. 附:6 4 3 5的排序全息過程。

i=4時。i=3時。

i=2時輸出。

4樓:網友

program dsort;

var a:array[1..10] of integer; /儲存原始資料和排族頌敏序後結果。

c:array[1..10,1..3]of integer; /儲存排序二叉樹。

i,j,n:integer;

inf,outf:text;

procedure init;

beginassign(inf,'');assign(outf,'');

reset(inf); rewrite(outf);

read(inf,n);

for i:=1 to n do read(inf,a[i]);

end;procedure tree(j:integer); 將櫻型乙個數插入到二叉樹中。

beginif (c[i,1]0 then sort(c[j,3]);

end;procedure dsort; /主程式。

beginfillchar(c,sizeof(c),0); c[1,1]:=a[1];

for i:=2 to n do

beginc[i,1]:=a[i];

tree(1);

end;i:=0;

sort(1);

end;procedure print;

var i:integer;

beginfor i:=1 to n do write(outf,a[i],'

close(outf);

end;begin

init;dsort;

print;

end.

快速排序,希爾排序和堆排序的平均時間複雜度都是O nlog2n ,為什麼說快速排序是最快的

快速排序是用遞迴的思想,用棧來儲存資料,它第n趟最多要確定2 n個數的最終位置。它使用的空間是最多的,用空間換取了時間。例如 快排只是內排序演算法啊,而且在內排序中也並不是最快的,只是快排在大多數情況下效果很好,因為一般的無序元素不會是完全或者近似倒序的。每種排序都有它的優勢。為什麼快速排序比堆排序...

快速 堆排序演算法,能用的來,不能用的免語

那個堆排序的演算法要求寫麼?記得上次去面試讓我現場寫了堆排序,堆排序其實真心很簡單,非常簡潔,比桶排序基數排序什麼的都還要容易寫,你不妨從以下幾個角度理解.使用陣列表示完全二叉樹的拆帶方法,如何訪問父節點,訪問子節點,如何判斷葉子.理解sift up和sift down兩個操作,其實就是不斷的向上或者...

在最壞情況下,堆排序需要比較的次數為多少

長月飛 標準答案是 0 nlog2n 首先前面的那個是o而不是0,相信你應該瞭解時間複雜度的表示方法吧,前面就有一個o,我認為此處也應該是和那個一樣的含義,即取n的最大次方!下面我們看看堆排序的定義 n個關鍵字序列kl,k2,kn稱為堆,當且僅當該序列滿足如下性質 簡稱為堆性質 1 ki k2i且k...