zoukankan      html  css  js  c++  java
  • 数据结构实验之排序四:寻找大富翁(SDUT 3401)

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void Swap(int a[], int i, int j)  // 交换函数
    {
        int t = a[i];
        a[i] = a[j];
        a[j] = t;
    }
    
    void HeapMerge(int *a,int i,int n)  //调整函数,也是核心地方 // 以下的树的概念都是把这个堆转变成树来说的
    {
        int lc = 2*i;  // 因为我们用一位数组存放的,这里下标从1开始,如果1存放根结点,那么左紫薯就是2×i 右紫薯是 2 × 1 + 1
        int rc = 2*i+1;  // 因为堆排序这里是一颗完全二叉树,层次遍历这个树,然后依次放进这个下标从1开始的数组中,得到的就是以上结果了
        int k = i;  //存放当前调整的结点的下标
        if(i <= n/2) //如果大于n/2,就是叶子结点了,就不需要再调整了
        {
            if(lc <= n && a[lc] > a[k]) // 左子树的比较
            {
                k = lc;
            }
            if(rc <= n && a[rc] > a[k]) // 右紫薯的比较 这样子就是选的左右紫薯中大的那个了
            {
                k = rc;
            }
            if(k != i)  // 如果找到了它的左右紫薯中比它大的
            {
                Swap(a,i,k); // 交换这两个值
                HeapMerge(a,k,n); // 继续把k这个位置的数,也就是上一步中为交换前的a[i],往下调整,要保证左右紫薯都小于根节点
            }
        }
    }
    
    void HeapCreat(int *a,int n)
    {
        for(int i=n/2; i>=1; i--)
        {
            HeapMerge(a,i,n); // 从第一个非叶子结点开始调整树,n/2就是第一个非叶子结点,完全二叉树的性质决定的。
        }
    }
    
    void HeapSort(int *a,int n)
    {
        int i;
        HeapCreat(a,n); //先调整好树,让成为一个大顶堆
        for(i=n; i>=1; i--)
        {
           Swap(a,1,i);  // 把这个堆顶,也就是最大的,放到最后
            HeapMerge(a,1,i-1); // i - 1 也就是剩下的再重新调整
                                // 直到全部完成,层次遍历树变成有序序列,对应的数组就是有序数组
        }
    }
    
    int main()
    {
        int n,m,p,t, Min;
        while(scanf("%d %d",&n,&m)!=EOF)
        {
            int a[12];
            p = 1;
            for(int i = 0; i < n; i++)  // 这个题的原因,不能全部输入,对于全部的数建堆
            {
                scanf("%d",&t);
                if(p < m + 1)
                    a[p++]=t;
                else
                {
                    Min = 1;
                    for(int j = 2; j < p; j++)
                    {
                        if(a[Min] > a[j])
                            Min = j;
                    }
                    if(a[Min] < t)
                        a[Min] = t;
                }
            }  //挑出来前 m 大的数
            HeapSort(a,m); // 堆排
            for(int i = m; i >= 1; i--)
                if(i==m)
                    printf("%d",a[i]);
                else
                    printf(" %d",a[i]);
            printf("
    ");
        }
        return 0;
    }
    
    
  • 相关阅读:
    Java源码赏析(四)Java常见注解
    Java源码赏析(三)初识 String 类
    Java源码赏析(二)Java常见接口
    Java源码赏析(一)Object 类
    Java随谈(二)对空指针异常的碎碎念
    Java随谈(一)魔术数字、常量和枚举
    jquery.validate 使用--验证表单隐藏域
    jquery.validate使用
    jquery.validate使用
    jquery.validate使用
  • 原文地址:https://www.cnblogs.com/lcchy/p/10139392.html
Copyright © 2011-2022 走看看