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...