SDAU训练日志第一篇----------排序算法(上)(2018年1月29日)

引例:

         经过了在山东农业大学一学期的学习,我们迎来了耿霞老师开设C++程序设计课程的期末考试,在程序设计题的第一题给我们出了一道这样的题:

((✺ω✺))给你一组数据(1<n<1000),数据中可能有重复,你的任务是完成去重,并按照从小到大顺序输出数据。(NOIP2006)

考试的时候拿到这个题有两个思路:

1.先去重再排序输出   2. 先排序再去重输出(重复的都在一起)

对于第一种思路,我们可以假设有很多桶,然后我们挨着枚举数据,把数据扔进带有编号的桶中,标记该桶,枚举完成后将带有标记的桶的编号进行输出。

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1000;
int main()
{
	bool flag[MAXN+1];
	//因为数组下标是少1的,我们多加一个元素表示maxn
	memset(flag,0,sizeof(flag));
	//初始化该桶
	int n=0,temp=0;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>temp;
		flag[temp]=true;
		//标记该桶
	}
	for(int i=1;i<=1000;i++)
		if(flag[i])
			cout<<i<<' ';
	return 0;
}
对于第二种思路:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int shuzu[101];
	memset(shuzu,0,sizeof(shuzu));
	int n=0;
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>shuzu[i];
	sort(shuzu,shuzu+n);
	cout<<shuzu[0]<<' ';
	for(int i=1;i<n;i++)
	{
		if(shuzu[i]!=shuzu[i-1])//不重复就输出
			cout<<shuzu[i]<<' ';
	}
	return 0;
}
由第一种方法的代码稍加修改可以引出今天学习的第一种排序:简化版的桶排序

#includ
### GD32F470 RT-Thread 开发指南与配置示例 #### 芯片与操作系统的适配基础 GD32F470是一款基于ARM Cortex-M4内核的高性能微控制器,支持多种外设接口。RT-Thread是一种实时操作系统,广泛应用于嵌入式开发领域。为了使两者协同工作,开发者需熟悉芯片的数据手册以及RT-Thread的相关文档。 以下是关于GD32F470与RT-Thread结合使用的几个关键方面: --- #### 网络驱动编写思路 在网络驱动设计中,需要考虑硬件特性与软件框架之间的交互。对于GD32F470芯片上的网络驱动,建议采用分层架构来实现数据传输逻辑[^1]。具体而言: - 初始化阶段:完成网卡设备初始化并注册到RT-Thread的网络栈。 - 数据收发处理:通过中断服务程序捕获外部事件,并调用RT-Thread API管理缓冲区分配和释放。 ```c // 注册网络设备函数模板 rt_err_t gd32_network_device_init(void) { struct netdev *net_dev; /* 创建网络设备实例 */ net_dev = rt_calloc(1, sizeof(struct netdev)); if (!net_dev) { return -RT_ENOMEM; // 内存不足错误 } /* 设置设备名称和其他属性 */ net_dev->name = "eth0"; net_dev->type = NETDEV_TYPE_ETHERNET; /* 绑定底层驱动回调函数 */ net_dev->init = eth_device_init; net_dev->open = eth_device_open; net_dev->close = eth_device_close; net_dev->send = eth_device_send; net_dev->recv = eth_device_recv; /* 将设备加入系统 */ rt_netdev_register(net_dev); return RT_EOK; } ``` --- #### 文件系统驱动开发流程 针对NOR Flash(如GD25Q256),可以通过SPI总线访问存储器内容,在此过程中涉及文件系统驱动的设计与挂载过程[^2][^3]。主要步骤如下所示: 1. **SPI驱动编写**:定义寄存器映射结构体并通过GPIO设置通信参数; 2. **文件系统初始化**:利用`dfs_mount()`方法指定根目录路径及其对应的物理介质地址; 3. **测试验证**:读取/写入特定分区中的样本数据以确认功能正常运行。 ```c #include <dfs_fs.h> /* 定义挂载点位置 */ const char mount_point[] = "/flash"; int main() { int result; /* 执行DFS挂载命令 */ result = dfs_mount("spi", /* 物理设备名 */ mount_point, /* 挂载点字符串 */ "elm", /* 使用ELMFS作为文件系统类型 */ 0, /* 默认标志位 */ NULL); /* 不传递额外参数 */ if (result != RT_EOK){ printf("Mount failed with error code %d\n", result); }else{ printf("Flash successfully mounted at '%s'\n", mount_point); } return 0; } ``` --- #### CAN模块的手动配置方式 当RT-Studio工具链未提供图形化界面选项时,则可通过编辑头文件的形式启用相应组件的功能支持[^4]。例如开启CAN通道一的支持只需简单添加两行宏定义即可生效。 ```c #define RT_CAN_USING_HDR /**< 启用HDR模式下的CAN驱动 */ #define BSP_USING_CAN1 /**< 明确声明当前项目需要用到第一个CAN端口 */ ``` > 注意事项:上述更改可能影响其他部分默认行为,请仔细阅读官方说明文档后再做调整! --- #### 键盘扫描应用案例分析 如果计划在GD32F4系列单片机上构建简易的人机交互界面,那么检测矩阵键盘状态便成为一项重要课题[^5]。下面列举了一个简化版算法用于识别用户输入动作序列号。 ```c static uint8_t key_scan(uint8_t row[], uint8_t col[]) { static uint8_t last_key = NO_KEY_PRESSED; uint8_t current_key; for(int i=0;i<ROWS;i++) { GPIO_SetBits(GPIOA,row[i]); for(int j=0;j<COLUMNS;j++) { if(!GPIO_ReadInputDataBit(GPIOB,col[j])){ current_key=(i*COLS)+j+1; while(!GPIO_ReadInputDataBit(GPIOB,col[j])); // 去抖延时 if(current_key!=last_key){ last_key=current_key; return last_key; } } } GPIO_ResetBits(GPIOA,row[i]); } return NO_KEY_PRESSED; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值