堆排( $Heapsort$ )
堆排是选择排序的一种。可以简单地理解为一种树形的选择排序。
基本思想:
堆排利用了数据结构堆的特性,它是一棵完全二叉树,数的每个节点存放该节点值的那个元素对应。
排序过程:
……
一共有7次操作,恕我不能一一列举
程序(Pascal):
//从小到大排序数组a
Var i,n:longint;
a:array[1..1000] of longint;
procedure change(Var a,b:longint);//交换
Var h:longint;
Begin
h:=a;
a:=b;
b:=h;
end;
procedure Heap(n,num:longint);//堆排序
Var j,x:longint;
Begin
x:=a[num];
j:=num*2;
while j<=n do
Begin
if (j<n) and (a[j]<a[j+1]) then inc(j);//存储左右子节点中较大子节点的下标
if x<a[j] then//将待比较的数和较大子节点下标进行比较,若较大子节点小于待比较的数时,调整元素值
Begin
a[num]:=a[j];
num:=j;
j:=num*2;
end
else//当较大子节点大于待比较的数时,满足堆的性质,退出建堆程序
Begin
j:=n+1;
end;
end;
a[num]:=x;
end;
Begin
read(n);//读入数据
for i:=1 to n do
Begin
read(a[i]);
end;
for i:=n div 2 downto 1 do
heap(n,i);
for i:=n downto 2 do//调整堆
Begin
change(a[1],a[i]);//交换a[1]与a[i]的值
heap(i-1,1);//重新调整堆
end;
for i:=1 to n do//输出
Begin
write(a[i]);
if i<n then write(' ');
end;
end.
由于不想编C语言程序,所以向各位使用C语言的朋友道歉。
PS:我的码风奇特,不喜勿喷