关于堆排序的理解

堆排序是利用二叉树的性质了,最后浮上最顶端的是最大的 然后把最大的放在后面,下次进行减一次的计算。

堆排序的第一次要建立大顶堆,让整个序列符合那个规律。规律看书。。

堆排序第一次建立堆的过程是一点点调的

如序列 40 55  73 12 98 27

第一次比73 和27   不变

第二次比 55  12  98   选择98 交换  

变成  40 98 73 12 55 27   交换之后判定55的位置下面是否需要交换

第三次比 40  98  73   把98换上去  变成  98 40 73 12 55 27  

之后 判定40时候符合大顶堆   比 40 12  55  发现55大  交换  变成  98 55 73 12 40 27  之后判定40是否需要交换


这是第一次建立堆的过程  


之后 看序列  98 55 73 12 40 27   会发现  浮上去的第一个为最大值   之后 把最大值和最后一个数字交换

变成  27 55 73 12 40 98   这时候 序列走堆排序只需要走前五个数   就是 27 55 73 12 40  

27 55 73 12 40 进入堆排序 

第一次比 27 55 73  发现73大   换  变成  73 55 27 12 40   之后判定27 是否需要和它的俩儿子交换,发现它没儿子所以结束  

序列 73 55 27 12 40  把73 和40 交换  

变成  40 55 27 12 73   这时候 再进入循环只需要走前四个   此时完整序列为 40  55  27  12  73  98  

40 55 27 12  进入下一次堆排序的过程 

40 和 55  27  比较   发现55大  交换     序列变成55 40 27 12  之后  40 后面发现它的儿子是12  不用换  结束 

之后的都是这个规则来。。




#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
int a[10000];
int n;
void dui(int l,int r)
{
    int dad=l;
    int son=dad*2;
    while (son <= r)
    { //若子節點指標在範圍內才做比較
		if (son + 1 <= r && a[son] < a[son + 1]) //先比較兩個子節點大小,選擇最大的
			son++;
		if (a[dad] > a[son]) //如果父節點大於子節點代表調整完畢,直接跳出函數
			return;
		else
		{ //否則交換父子內容再繼續子節點和孫節點比較
			swap(a[dad], a[son]);
			dad = son;
			son = dad * 2;
		}
	}
}
void vsort()
{
    for (int i = n/2; i >= 1; i--)//第一次建立堆
		dui(i,n);

    for (int i = 1; i <=n; i++)
		cout<<a[i]<<' ';cout<<endl;

    for(int i=n;i>1;i--)
    {
        swap(a[1],a[i]);
        dui(1,i-1);
        for (int i = 1; i <=n; i++)
		cout<<a[i]<<' ';cout<<endl;
    }
}
int main()
{
    while(cin>>n)
    {
        for(int i=1;i<=n;i++)
            cin>>a[i];

        vsort();

    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值