鱼C论坛

 找回密码
 立即注册
查看: 2703|回复: 5

[已解决]堆排序

[复制链接]
发表于 2018-8-25 10:19:55 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>

void swap(int k[],int i,int j)
{
        int temp;

        temp=k[i];
        k[i]=k[j];
        k[j]=temp;
}

void  HeapAdjust(int k[],int s,int n)
{
        int i;
        int temp;

    temp=k[s];  //待调整的双亲结点


        for(i=2*s;i<=n;i*=2) //i 左孩子   s 是双亲
        {
                if(i<n&&k[i]<k[i+1])  //如果左孩子 小于右孩子 ,
                {
                        i++;      //使 i 指向 较大的元素
                }
                if(temp>=k[i])
                {
                        break;
                }
                k[s]=k[i];
                s=i;
        }
        k[s]=temp;
}

void HeapSort(int k[],int n)    //构建大顶堆
{
        int i;
        for(i=n/2;i>0;i--)
        {
                HeapAdjust(k,i,n);   //数组k 传递数据  i 是传递双亲, n 是用来判断的     调整成打顶堆的
        }

        for(i=n;i>1;i--)
        {
                swap(k,1,i);
                HeapAdjust(k,1,n-1);
        }
}

int  main()
   {
           int a[10]={-1,5,2,6,8,3,9,1,7,4}; // 层次排序构造二叉树
           int i;

           HeapSort(a,9);

           printf("排序出来的结构");
           for(i=1;i<10;i++)
           {
                   printf("%d",a[i]);
           }
   }


看着小甲鱼的代码打的,但是我的结果是错的。 我寻找错误的时候,
1.理解不了了 第二次 HeadAdjust 第二个参数 为什么是 1
2.并且恳求 指教代码的错误
最佳答案
2018-8-25 11:56:09
#include <stdio.h>

void swap(int k[], int i, int j)
{
        int temp;
        
        temp = k[i];
        k[i] = k[j]; 
        k[j] = temp;
}

void HeapAdjust(int k[], int s, int n)
{
        int i, temp;
        
        temp = k[s];        // current pointed parent node
        
        for(i= 2*s; i <= n; i *= 2)                // 2*s == lchild, 2*s+1 == rchild
        {                                                                        // i*=2 >> next parent
                if(i < n && k[i] < k[i+1])                // lchild < rchild
                {
                        i++;                                                // points to rchild
                }
                if(temp >= k[i])
                {
                        break;
                }
                
                k[s] = k[i];
                s = i;
        }
        k[s] = temp;
}

void HeapSort(int k[], int n)
{
        int i;
        
        for(i = n/2; i > 0; i--)        // Construct Big Tree
        {
                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, 2, 6, 3, 9, 1, 7, 4};        //{5, 2, 6, 3, 9, 1, 7, 4, 8};
        
        HeapSort(a, 9);
        printf("Sorted list: ");
        for(i = 1; i < 10; i++)
        {
                printf("%d ", a[i]);
        }
        printf("\n");
        
        return 0;
}
从元素 1 开始,也就是第二个元素。因为元素 0 是补上去但不在操作范围内的
MQ4LYXAAO~[~B87A0A~WTOJ.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-25 11:56:09 | 显示全部楼层    本楼为最佳答案   
#include <stdio.h>

void swap(int k[], int i, int j)
{
        int temp;
        
        temp = k[i];
        k[i] = k[j]; 
        k[j] = temp;
}

void HeapAdjust(int k[], int s, int n)
{
        int i, temp;
        
        temp = k[s];        // current pointed parent node
        
        for(i= 2*s; i <= n; i *= 2)                // 2*s == lchild, 2*s+1 == rchild
        {                                                                        // i*=2 >> next parent
                if(i < n && k[i] < k[i+1])                // lchild < rchild
                {
                        i++;                                                // points to rchild
                }
                if(temp >= k[i])
                {
                        break;
                }
                
                k[s] = k[i];
                s = i;
        }
        k[s] = temp;
}

void HeapSort(int k[], int n)
{
        int i;
        
        for(i = n/2; i > 0; i--)        // Construct Big Tree
        {
                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, 2, 6, 3, 9, 1, 7, 4};        //{5, 2, 6, 3, 9, 1, 7, 4, 8};
        
        HeapSort(a, 9);
        printf("Sorted list: ");
        for(i = 1; i < 10; i++)
        {
                printf("%d ", a[i]);
        }
        printf("\n");
        
        return 0;
}
从元素 1 开始,也就是第二个元素。因为元素 0 是补上去但不在操作范围内的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-25 11:59:59 | 显示全部楼层
HeapAdjust(k,1,n-1);
HeapAdjust(k,1,i-1);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-25 12:00:40 | 显示全部楼层
HeapAdjust(k,1,n-1);
HeapAdjust(k,1,i-1);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-8-25 12:56:55 | 显示全部楼层
claws0n 发表于 2018-8-25 11:56
从元素 1 开始,也就是第二个元素。因为元素 0 是补上去但不在操作范围内的

谢谢你
在这个过程我一直在想,但我觉得应该 第二个 HeapAdjust () 函数中第二个参数是1,是双亲的位置, 因为 在第一次的转换位置之后,根节点 的位置是有问题的,最大的元素跑到了最后,不符合了大顶锥,其余的在第一次HeapAdjust(),函数 已经排好了。 所以它要重新调整 那个位置, 就是 1 的位置, 也正如你说的,元素是从1 开始的。 所以 传递 1 这个双亲的位置。

这是我迷惑的地方。 还是谢谢你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-25 12:57:35 | 显示全部楼层
claws0n 发表于 2018-8-25 12:00
HeapAdjust(k,1,n-1);
HeapAdjust(k,1,i-1);

懂拉~  thanks~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 08:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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