非寻常选择排序

五迷三道 提交于 2019-11-27 12:38:38

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!