第十六周上机实践—项目1(1)—验证算法 直接插入排序 折半插入排序

本文介绍了直接插入排序、折半插入排序算法的实现及过程展示,通过具体测试数据,直观地展示了排序效果,并对算法思路和实现方法进行了深入解析。
/*      
 *Copyright(c) 2015,烟台大学计算机学院      
 *All rights reserved.      
 *文件名称:test.cpp      
 *作者:林莉      
 *完成日期:2015年12月14日      
 *版本:v1.0      
 *      
 *问题描述:用序列{9,8,7,6,5,4,3,2,1,0}作为测试数据,运行并本周视频中所讲过的算法对应 程
 序,观察运行结果并深刻领会算法的思路和实现方法:(1)直接插入排序 折半插入排序
 *输入描述:无      
 *输出描述:所得结果。   
 */ 

1.直接插入排序

#include <stdio.h>
#define MaxSize 20
typedef int KeyType;    //定义关键字类型
typedef char InfoType[10];
typedef struct          //记录类型
{
    KeyType key;        //关键字项
    InfoType data;      //其他数据项,类型为InfoType
} RecType;              //排序的记录类型定义

void InsertSort(RecType R[],int n) //对R[0..n-1]按递增有序进行直接插入排序
{
    int i,j;
    RecType tmp;
    for (i=1; i<n; i++)
    {
        tmp=R[i];
        j=i-1;            //从右向左在有序区R[0..i-1]中找R[i]的插入位置
        while (j>=0 && tmp.key<R[j].key)
        {
            R[j+1]=R[j]; //将关键字大于R[i].key的记录后移
            j--;
        }
        R[j+1]=tmp;      //在j+1处插入R[i]
    }
}

int main()
{
    int i,n=10;
    RecType R[MaxSize];
    KeyType a[]= {9,8,7,6,5,4,3,2,1,0};
    for (i=0; i<n; i++)
        R[i].key=a[i];
    printf("排序前:");
    for (i=0; i<n; i++)
        printf("%d ",R[i].key);
    printf("\n");
    InsertSort(R,n);
    printf("排序后:");
    for (i=0; i<n; i++)
        printf("%d ",R[i].key);
    printf("\n");
    return 0;
}


运行结果:

2.显示直接插入排序过程

#include <stdio.h>
#define MaxSize 20
typedef int KeyType;    //定义关键字类型
typedef char InfoType[10];
typedef struct          //记录类型
{
    KeyType key;        //关键字项
    InfoType data;      //其他数据项,类型为InfoType
} RecType;              //排序的记录类型定义

void InsertSort(RecType R[],int n) //对R[0..n-1]按递增有序进行直接插入排序
{
    int i,j,k;
    RecType tmp;
    for (i=1; i<n; i++)
    {
        tmp=R[i];
        j=i-1;            //从右向左在有序区R[0..i-1]中找R[i]的插入位置
        while (j>=0 && tmp.key<R[j].key)
        {
            R[j+1]=R[j]; //将关键字大于R[i].key的记录后移
            j--;
        }
        R[j+1]=tmp;      //在j+1处插入R[i]
        printf("i=%d: ",i);
        for (k=0; k<n; k++)
            printf("%d ",R[k].key);
        printf("\n");
    }
}

int main()
{
    int i,n=10;
    RecType R[MaxSize];
    KeyType a[]= {9,8,7,6,5,4,3,2,1,0};
    for (i=0; i<n; i++)
        R[i].key=a[i];
    printf("排序前:");
    for (i=0; i<n; i++)
        printf("%d ",R[i].key);
    printf("\n");
    InsertSort(R,n);
    printf("排序后:");
    for (i=0; i<n; i++)
        printf("%d ",R[i].key);
    printf("\n");
    return 0;
}


运行结果:

3.折半插入排序

#include <stdio.h>
#define MaxSize 20
typedef int KeyType;    //定义关键字类型
typedef char InfoType[10];
typedef struct          //记录类型
{
    KeyType key;        //关键字项
    InfoType data;      //其他数据项,类型为InfoType
} RecType;              //排序的记录类型定义

void InsertSort1(RecType R[],int n) //对R[0..n-1]按递增有序进行直接插入排序
{
    int i,j,low,high,mid;
    RecType tmp;
    for (i=1; i<n; i++)
    {
        tmp=R[i];
        low=0;
        high=i-1;
        while (low<=high)
        {
            mid=(low+high)/2;
            if (tmp.key<R[mid].key)
                high=mid-1;
            else
                low=mid+1;
        }
        for (j=i-1; j>=high+1; j--)
            R[j+1]=R[j];
        R[high+1]=tmp;
    }
}
int main()
{
    int i,n=10;
    RecType R[MaxSize];
    KeyType a[]= {9,8,7,6,5,4,3,2,1,0};
    for (i=0; i<n; i++)
        R[i].key=a[i];
    printf("排序前:");
    for (i=0; i<n; i++)
        printf("%d ",R[i].key);
    printf("\n");
    InsertSort1(R,n);
    printf("排序后:");
    for (i=0; i<n; i++)
        printf("%d ",R[i].key);
    printf("\n");
    return 0;
}


运行结果:

【源码免费下载链接】:https://renmaiwang.cn/s/dr27a 编程环境设置如下: 1. 操作系统:Windows XP SP2 开发语言:C++ / MFC 编译环境:MS Visual C++6.0 参数配置分为三部分: - 第一参数为接收窗口大小控制,由于帧序列号采用四位编码方式,因此其设定范围限定在1至8之间。其中设置为1时将采用后退N帧的滑动窗口协议机制;当大于1时则采用选择性重传策略的滑动窗口协议。 - 第二参数为接收速率调节器,用户可在编辑框中输入定时器间隔时间值(单位:ms),例如数值表示每秒处理一个数据包的能力。特别地,设定值为1000时即意味着接收速率为每秒处理1个包。 - 第三参数为辅助定时器设置项,该参数决定了在接收到数据包后无反向流量应答的情况下,发送方需等待应答包的时间延迟(单位:ms)。 异常处理界面提供以下功能: - 用户可在此区手动输入丢失的响应帧,并以帧序列号形式填写具体内容。各参数之间使用空格分隔以便于识别和编辑。 - 当前状态显示接收窗口运行状况,包括当前接收到的数据包范围、令牌计数等关键指标信息。 - 输出界面用于实时展示接收方系统的运行情况及协议交互过程。 用户需在所有相关参数配置完毕后,点击"开始接收"按钮以进入数据接收模式。发送程序界面如图2所示,其功能分区与上文描述一致。
内容概要:本文介绍了基于dq0变换的三相串联有源电力滤波器(SAPF)的Simulink仿真模型,重点利用dq0坐标变换实现对谐波和无功电流的精确检测与补偿,提升电力系统的电能质量。文档还涵盖了中间直流环节的三相电力电子变压器(PET)建模、固定电容器与可控基于dq0变换的三相串联有源电力滤波器的Simulink模型SAPF晶闸管无功补偿装置(FCTCR)等配套设备的仿真设计,形成完整的电力系统仿真体系。此外,文中整合了多种先进仿真案例,包括基于现代智能算法的优化控制、故障诊断、路径规划及信号处理等内容,展示了MATLAB/Simulink在电力电子与电力系统领域的广泛应用能力。; 适合人群:电气工程、自动化及相关专业的研究生、科研人员及从事电力系统仿真与控制的工程技术人员;具备一定MATLAB/Simulink使用基础和电力电子背景知识的开发者;; 使用场景及目标:① 掌握dq0变换在有源滤波器中的应用原理与建模方法;② 学习SAPF系统的设计思路与仿真调试技巧;③ 借鉴文中提供的多种电力系统仿真模型与优化算法实现方案,用于科研项目或实际工程开发;④ 结合智能优化算法与深度学习技术开展电能质量治理与故障诊断研究; 阅读建议:建议读者按照文档结构循序渐进地学习,重点关注dq0变换的数学原理及其在Simulink中的模块化实现,动手搭建模型并进行参数调试。同时可参考文中提供的网盘资源获取完整代码与模型文件,结合实际需求进行二次开发与创新研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值