非寻常选择排序

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

猜你喜欢

转载自blog.csdn.net/cpongo11/article/details/99674874