排序【2】选择排序

选择排序

算法思想:以升序为例,在整个区间中找出排序码最小的元素,如果这个元素不是这组序列中的第一个元素,那么将它和第一个元素进行交换,使得最小的元素就在第一个位置,然后缩小区间,循环执行上述操作,只到区间中只剩下一个元素。
具体步骤(升序)

  1. 在区间中找到关键码最小的元素。
  2. 如果不是待排序区间的第一个元素,则和带排序区间第一个元素交换。
  3. 缩小待排序区间。这里写图片描述
    代码实现:
void ChangeSort(int *array, int size)
{
    assert(array);
    for (int i = 1; i < size; ++i)
    {
        int minindex = i;//未排序的最小元素下标
        int start = i - 1;//未排序区间第一个元素下标
        while (minindex<size)
        {
            if (array[minindex] < array[start])
                swap(array[minindex], array[start]);
            ++minindex;
        }

    }
}

算法性能
时间复杂度:最好的情况是已经有序,交换次数为0,最坏的情况是逆序,交换次数是n-1,比较次数与关键字的初始状态无关。总的比较次数为N=n*(n-1)/2,所以时间复杂度为O(N^2)
空间复杂度:O(1)
稳定性:不稳定


堆排序

基本思想:堆排序就是利用堆这种数据结构实现的一种排序算法,堆是完全二叉树的一种。堆的特点是:

  1. 最大堆:每一个父节点的值都大于两个子节点
  2. 最小堆:每一个父节点的值都小于两个子节点
    堆排序的基本思想就是利用了这种结构,如果我们需要升序:
    1.把所有[a1,a2,a3…an]建成大堆。
    2.把堆顶的元素(即数组中最大的元素和堆中最后一个元素交换),此时分为两个区域,一个[a1,a2,an–1]无序区和[an]有序区。
    3.因为交换了元素,有可能会违反了堆的性质,因此无序区的元素进行调整,满足堆的性质。
    4.重复步骤2,直到有序区的元素有n-1个。
    这里写图片描述
    代码实现:
void AdJustDown(int *array, int size, int n)
{
    int parent = n;
    int child = parent*+1;
    while (child<n)
    {
        if ((child + 1 < size) && array[child] < array[child + 1])
        {
            ++child;
        }
        if (array[child] > array[parent])
        {
            swap(array[child], array[parent]);
            parent = child;
            child = parent * 2 + 1;
        }
        else
        {

            break;
        }
    }
}
void HeapSort(int *array, int size)
{
    assert(array);
    for (int i=(size-2)>>1;i>=0;++i)
    {
        AdJustDown(array,size,i);//创建大堆,将所有数据都重新排序
    }
    for (int i = size - 1; i >= 0; ++i)
    {
        swap(array[0], array[size]);//交换堆顶元素和已序序列第一个元素
        AdJustDown(array, i, 0);//缩小区间,调整堆结构
    }

}

算法性能

  1. 时间复杂度:因为堆中元素的个数是N,所以堆的高度是logN,那么比较次数就是2logN,交换的次数是N次,所以平均时间复杂度是O(NlogN)
  2. 空间复杂度:O(1)
  3. 稳定性:不稳定

验证结果:
这里写图片描述

内容概要:本文档详细介绍了一个基于多任务学习(MTL)结合Transformer编码器的多变量时间序列预测项目。该项目旨在解决多变量时间序列预测中的复杂性、长序列依赖、任务间干扰等问题,通过融合多任务学习与Transformer架构,构建了一套高效且可扩展的预测系统。项目覆盖了从环境准备、数据预处理、模型构建与训练、性能评估到GUI界面设计的完整流程,并提供了详细的代码实现。模型采用多头自注意力机制有效捕捉变量间及时间维度上的复杂依赖,通过多任务共享层和任务特异性层实现任务间知识共享与个性化特征提取。此外,项目还引入了动态任务权重调整、轻量化设计、数据预处理优化等关键技术,确保模型在实际应用中的高效性和准确性。 适合人群:具备一定编程基础,特别是对深度学习和时间序列分析有一定了解的研发人员和技术爱好者。 使用场景及目标:① 提升多变量时间序列预测的准确率;② 实现高效的时间序列特征提取;③ 促进多任务学习在时间序列领域的应用推广;④ 提供可扩展的模型架构设计,适应不同应用场景的需求;⑤ 降低模型训练与推断的计算资源需求;⑥ 促进复杂系统的智能决策能力,如智能制造、能源管理、金融分析、气象预报等领域的精准预测支持。 其他说明:项目不仅提供了完整的代码实现和详细的文档说明,还设计了用户友好的GUI界面,方便用户进行数据加载、参数设置、模型训练及结果可视化等操作。未来改进方向
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值