C实现heap堆排序

  所谓的堆排序,就是把数组虚拟成二叉堆。其定义必须满足如下2个条件中的一个条件:
    
    假设数组a[n]
        (1) 二叉堆中的父节点a[r] 必须大于等于子节点
        (2)二叉堆的父节点必须小于等于子节点

        Parent(i):
                return a[(i]
        Left(i):
                return a[(i+1)<<1-1]
        Right(i):
                return a[(i+1)<<1]
   
    二叉堆的维护(移动对应节点的值):
        a的数组大小为 asize
        二叉堆当前的有效元素的大小为psize
        adjustheap(a,i):
            left = (i+1)<<1-1;
            right = (i+1)<<1;
            big = i
            if left< psize && a[left] >= a[i]
                big =left 
            if right < psize && a[right] >= a[i]
                big = right
            if big != i
                swap(a[big],a[i]
                adjustheap(a,big)
     建堆:
          build(a):
            psize = asize
            for i= psize>>2-1 downto 1
                    adjustheap(a,i)
      排序:
         sort(a):
           bulid(a)
           psize = size -1
           for i = psize and i>0 and i--:
                 swap(a[i],a[0])
                 psize--;
                 adjustheap(a[i],0)

/*************************************************************************
        > File Name: heapsort.c
        > Author: zhoulin
        > Mail: 715169549@qq.com
        > Created Time: Wed 30 Mar 2016 03:39:20 AM CST
 ************************************************************************/
#include "heapsort.h"
#include <stdio.h>
static void Swap(int *a,int *b)
{
    *a = *a^*b;
    *b = *a^*b;
    *a = *a^*b;
}
void AdjustHeapBig(heap *hp,int i)
{
    unsigned int left = (i+1)<<1-1; // array is start with 0
    unsigned int right = (i+1)<<1;
    unsigned int big = i;
    int *arr = hp->arr;
    unsigned int max = hp->index;
    if(left <= max && arr[left] <= arr[i])
    {
        big = left;
    }
    if(right <= max && arr[right] <= arr[big])
    {
        big = right;
    }
    if(big != i)
    {
        Swap(&arr[big],&arr[i]);
        AdjustHeapBig(hp,big);
    }
}
void AdjustHeapSmall(heap *hp,int i)
{
    unsigned int left = (i+1)<<1-1; // array is start with 0
    unsigned int right = (i+1)<<1;
    unsigned int small = i;
    int *arr = hp->arr;
    unsigned int max = hp->index;
    if(left <= max && arr[left] >= arr[i])
    {
        small = left;
    }
    if(right <= max && arr[right] >= arr[small])
    {
        small = right;
    }
    if(small != i)
    {
        Swap(&arr[small],&arr[i]);
        AdjustHeapSmall(hp,small);
    }
}
void SortHeapBig(heap *hp)
{
    int *arr = hp->arr;
    int size = hp->len;
    int i;
    for(i = size>>1-1;i >= 0; i--)
    {
        AdjustHeapBig(hp,i);
    }
    while(hp->index > 0)
    {
        Swap(&arr[0],&arr[hp->index]);
        hp->index--;
        AdjustHeapBig(hp,0);
    }
}
void SortHeapSmall(heap *hp)
{
    int *arr = hp->arr;
    int size = hp->len;
    int i;
    for(i = size>>1-1;i >= 0; i--)
    {
        AdjustHeapSmall(hp,i);
    }
    while(hp->index > 0)
    {
        Swap(&arr[0],&arr[hp->index]);
        hp->index--;
        AdjustHeapSmall(hp,0);
    }
}
int main(void)
{
    int i;
    int arr[11] = {19,2,45,80,21,56,1,100,3,99,19};
    fprintf(stdout,"****************src array******************\n\n");
    for(i = 0; i< 11;i++)
    {
        if(i == 10)
        {
            fprintf(stdout," %d\n",arr[i]);
            break;
        }
        fprintf(stdout," %d ,",arr[i]);
    }
    heap p;
    p.len = 11;
    p.arr = arr;
    p.index = p.len -1;
    SortHeapBig(&p);
    fprintf(stdout,"****************big heap sort******************\n\n");
    for(i = 0; i< p.len;i++)
    {
        if(i == p.len -1)
        {
            fprintf(stdout," %d\n\n",arr[i]);
            break;
        }
        fprintf(stdout," %d ,",arr[i]);
    }
    // insert sort
    int arr2[11] = {19,2,45,80,21,56,1,100,3,99,19};
    for(i = 0;i < 11;i++)
    {
        p.len = i+1;
        p.arr = arr2;
        p.index = p.len-1;
        SortHeapBig(&p);
        int j = 0;
        fprintf(stdout,"---------sort %d-------------------\n",i+1);
        for(;j<=i;j++)
        {
            if(j == i)
            {
                fprintf(stdout," %d\n\n",arr2[j]);
                break;
            }
            fprintf(stdout," %d ,",arr2[j]);
        }
    }
    //
    int arr1[11] = {19,2,45,80,21,56,1,100,3,99,19};
    p.len = 11;
    p.arr = arr1; 
    p.index = p.len -1;
    SortHeapSmall(&p);
    fprintf(stdout,"****************small heap sort******************\n\n");
    for(i = 0; i< p.len;i++)
    {
        if(i == p.len-1)
        {
            fprintf(stdout," %d\n\n",arr1[i]);
            break;
        }
        fprintf(stdout," %d ,",arr1[i]);
    }
    return 0;
}

运行结果:

****************src array******************

 19 , 2 , 45 , 80 , 21 , 56 , 1 , 100 , 3 , 99 , 19
****************big heap sort******************

 100 , 99 , 80 , 56 , 45 , 21 , 19 , 19 , 3 , 2 , 1

---------sort 1-------------------
 19

---------sort 2-------------------
 19 , 2

---------sort 3-------------------
 45 , 19 , 2

---------sort 4-------------------
 80 , 45 , 19 , 2

---------sort 5-------------------
 80 , 45 , 21 , 19 , 2

---------sort 6-------------------
 80 , 56 , 45 , 21 , 19 , 2

---------sort 7-------------------
 80 , 56 , 45 , 21 , 19 , 2 , 1

---------sort 8-------------------
 100 , 80 , 56 , 45 , 21 , 19 , 2 , 1

---------sort 9-------------------
 100 , 80 , 56 , 45 , 21 , 19 , 3 , 2 , 1

---------sort 10-------------------
 100 , 99 , 80 , 56 , 45 , 21 , 19 , 3 , 2 , 1

---------sort 11-------------------
 100 , 99 , 80 , 56 , 45 , 21 , 19 , 19 , 3 , 2 , 1

****************small heap sort******************

 1 , 2 , 3 , 19 , 19 , 21 , 45 , 56 , 80 , 99 , 100

 

转载于:https://www.cnblogs.com/innobase/p/5348436.html

卷积神经网络(CNN)是针对多维网格数据(如图像、视频)设计的深度学习架构,其结构灵感来源于生物视觉系统对信息的分层处理机制。该模型通过局部连接、参数共享、层级特征提取等策略,有效捕获数据中的空间模式。以下从结构特性、工作机制及应用维度展开说明: **1. 局部连接与卷积运算** 卷积层利用可学习的多维滤波器对输入进行扫描,每个滤波器仅作用于输入的一个有限邻域(称为感受野),通过线性加权与非线性变换提取局部特征。这种设计使网络能够聚焦于相邻像素间的关联性,从而识别如边缘走向、色彩渐变等基础视觉模式。 **2. 参数共享机制** 同一卷积核在输入数据的整个空间范围内保持参数不变,大幅降低模型复杂度。这种设计赋予模型对平移变换的适应性:无论目标特征出现在图像的任何区域,均可由相同核函数检测,体现了特征位置无关性的建模思想。 **3. 特征降维与空间鲁棒性** 池化层通过对局部区域进行聚合运算(如取最大值或均值)实现特征降维,在保留显著特征的同时提升模型对微小形变的容忍度。这种操作既减少了计算负荷,又增强了特征的几何不变性。 **4. 层级特征抽象体系** 深度CNN通过堆叠多个卷积-池化层构建特征提取金字塔。浅层网络捕获点线面等基础模式,中层网络组合形成纹理部件,深层网络则合成具有语义意义的对象轮廓。这种逐级递进的特征表达机制实现了从像素级信息到概念化表示的自动演进。 **5. 非线性扩展与泛化控制** 通过激活函数(如ReLU及其变体)引入非线性变换,使网络能够拟合复杂决策曲面。为防止过拟合,常采用权重归一化、随机神经元失活等技术约束模型容量,提升在未知数据上的表现稳定性。 **6. 典型应用场景** - 视觉内容分类:对图像中的主体进行类别判定 - 实例定位与识别:在复杂场景中标定特定目标的边界框及类别 - 像素级语义解析:对图像每个像素点进行语义标注 - 生物特征认证:基于面部特征的个体身份鉴别 - 医学图像判读:辅助病灶定位与病理分析 - 结构化文本处理:与循环神经网络结合处理序列标注任务 **7. 技术演进脉络** 早期理论雏形形成于1980年代,随着并行计算设备的发展与大规模标注数据的出现,先后涌现出LeNet、AlexNet、VGG、ResNet等里程碑式架构。现代研究聚焦于注意力分配、跨层连接、卷积分解等方向,持续推动模型性能边界。 卷积神经网络通过其特有的空间特征提取范式,建立了从原始信号到高级语义表达的映射通路,已成为处理几何结构数据的标准框架,在工业界与学术界均展现出重要价值。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
屋顶面板实例分割数据集 一、数据集基础信息 • 数据集名称:屋顶面板实例分割数据集 • 图片数量: 训练集:1559张图片 验证集:152张图片 测试集:95张图片 总计:1806张图片 • 训练集:1559张图片 • 验证集:152张图片 • 测试集:95张图片 • 总计:1806张图片 • 分类类别: panel(面板):屋顶上的面板结构,如太阳能板或其他安装组件。 roof(屋顶):建筑屋顶区域,用于定位和分割。 • panel(面板):屋顶上的面板结构,如太阳能板或其他安装组件。 • roof(屋顶):建筑屋顶区域,用于定位和分割。 • 标注格式:YOLO格式,包含实例分割的多边形标注,适用于实例分割任务。 • 数据格式:图片文件,来源于航拍或建筑图像,涵盖多种场景。 二、数据集适用场景 • 建筑与施工检查:用于自动检测和分割屋顶上的面板,辅助建筑质量评估、维护和安装规划。 • 可再生能源管理:在太阳能发电系统中,识别屋顶太阳能板的位置和轮廓,优化能源部署和监控。 • 航拍图像分析:支持从空中图像中提取建筑屋顶信息,应用于城市规划、房地产评估和基础设施管理。 • 计算机视觉研究:为实例分割算法提供基准数据,推动AI在建筑和能源领域的创新应用。 三、数据集优势 • 精准实例分割标注:每个面板和屋顶实例均通过多边形标注精确定义轮廓,确保分割边界准确,支持细粒度分析。 • 类别聚焦与实用性:专注于屋顶和面板两个关键类别,数据针对性强,直接适用于建筑和能源行业的实际需求。 • 数据多样性与泛化性:涵盖不同环境下的屋顶和面板图像,增强模型在多变场景中的适应能力。 • 任务适配便捷:标注兼容主流深度学习框架(如YOLO),可快速集成到实例分割模型训练流程。 • 行业价值突出:助力自动化检测系统开发,提升建筑检查、能源管理和城市分析的效率与准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值