堆排( $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:我的码风奇特,不喜勿喷