鱼C论坛

 找回密码
 立即注册
查看: 3128|回复: 1

堆排序算法看不明白的一处

[复制链接]
发表于 2017-9-14 00:33:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 panzer111 于 2017-9-14 00:49 编辑

// 159.cpp : 定义控制台应用程序的入口点。
//
#include "StdAfx.h"
#include <stdio.h>
void swap(int k[],int i,int j)
{
        int temp;
        temp=k;
        k=k[j];
        k[j]=temp;
}
void HeapAdjust(int k[],int s, int n)
{
        int i;
        int temp=k;
        for(i=2*s;i<=n;i*=2)
        {
                if (i<n && k<k[i+1])
                {
                        i++;
                }
                if (temp >=k)
                {
                        break;
                }
                k=k;
                s=i;
        }
        temp=k;

}

void HeapSort(int k[],int n)
{
        int i;
        for(i=n/2;i>0;i--)
                HeapAdjust(k,i,n);
        for(i=n;i>1;i--)
        {        swap(k,1,i);
                HeapAdjust(k,1,i-1);

        }
}
int main()
{
        int i,a[10]={1,5,7,3,54,49,21,78,47,16};
        HeapSort(a,9);
        for(i=1;i<10;i++)
        {
                printf("%d",a);
        }
        return 0;
}
------------------
void HeapSort(int k[],int n)
{
        int i;
        for(i=n/2;i>0;i--)
                HeapAdjust(k,i,n);
        for(i=n;i>1;i--)
        {        swap(k,1,i);
                HeapAdjust(k,i,i-1);

        }
}
------------------
第一个for循环结束后,i已经到了0,首先从n/2开始构建堆,然后从n/2-1开始,自减直到1,也即是第一个起始数,那么第一个for循环结束后是否意味着对整个数组而言,HeapAdjust的整体大顶堆已经构建完毕?

既然整体大顶堆构建完毕,是指所有元素达到有序排列,还是仅仅把最大元素送上堆顶?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-9-14 00:38:52 | 显示全部楼层
本帖最后由 panzer111 于 2017-9-14 00:52 编辑

如果第一个for循环后大顶堆已经完毕,说明从n/2开始,到起始节点的上一行的最右节点开始构建

也就是说总会从起始节点i的双亲i/4,i/8....直到1,开始构建

for循环完毕后整个堆已经是有序状态,直接输出即可,为何还要第二个for循环?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 23:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表