C/C++ 七大排序算法 之 “希尔排序”

排序:即将一组混乱的数据按从小到大或者从大到小的顺序进行有序的排列出来。

希尔排序算法图解:
在这里插入图片描述

思路解答:

选择增量 :gap = length / 2,缩小增量:gap = gap / 2
增量序列:用序列表示增量选择,{ n / 2, (n / 2) / 2, …, 1}
先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述:
选择一个增量序列 t1,t2,…,tk,其中 ti>tj,tk=1;
按增量序列个数 k,对序列进行 k 趟排序;
每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序;
仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

在这里插入图片描述

简单来说,拿数组的长度除以2得到一个增量,然后根据增量来给数组的数据分成增量那么多个组,然后每组做插入排序。然后增量再除以2,得到新的增量,再进行分组,插入排序;直到增量为1时,再进行插入排序,就完成了排序了。

希尔排序时选择排序的升级版!

时间复杂度: O(n2)


代码实现:

代码中有详细注释

#include <iostream>
#include <Windows.h>

using namespace std;

void ShellSort(int *arr, int len) {
	int grp = len / 2;		// 计算增量

	for (; grp > 0; grp = grp / 2) {	// 每次计算完一轮,增量再除以二

		// 选择排序
		for (int i = grp; i < len; i++) {	
			int cur = arr[i];	// 先空出第二个数的位置
			int j = 0;

			// 根据增量往前比较,小的在前,大的在后
			for (j = i - grp; j >= 0 && arr[j] > cur; j = j - grp) {
				arr[j + grp] = arr[j];	// 符合条件将前面的数据移动到空出的位置
			}
			arr[j + grp] = cur;	// 最后将待插入数据cur插入到前面空出的位置
		}
	}
	
}

int main(void) {
	int arr[]{ 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
	int len = sizeof(arr) / sizeof(arr[0]);


	ShellSort(arr, len);

	for (int i = 0; i < len; i++) {
		cout << *(arr + i) << ", ";
	}
	cout << endl;

	system("pause");
	return 0;
}

运行截图:
在这里插入图片描述

<think>好的,用户想了解如何制作遥感图像多类别语义分割的数据集。我需要先回忆相关的引用内容,然后结合这些信息给出步骤。 首先,根据引用[2],制作数据集需要标注工具和注意事项。常用的工像是Labelme、ENVI或ArcGIS,可能需要高精度标注。另外,要注意地理坐标对齐和影像预处理,比如辐射校正和几何校正。 然后,引用[3]中提到云数据集的标签是单通道8位图片,每个像素值对应类别。比如0是无云,1是有云。多类别的话可能需要扩展像素值,比如0到N对应不同类别,每个类别有唯一的颜色或数值。 接下来,用户需要多类别,所以步骤可能包括:数据采集、预处理、标注、格式转换、数据增强、划分数据集。每个步骤需要详细说明。 数据采集部分要确保覆盖所有目标地物类型,分辨率一致。引用[3]中的数据集分辨率从0.5到15米不等,但实际制作时可能需要统一分辨率,避免模型训练问题。 预处理部分,引用[2]提到辐射和几何校正,确保影像质量。还有可能需要裁剪成小尺寸,比如引用[3]中的1280x720,但可能需要更小的块,如512x512,以适应模型输入。 标注工具方面,引用[2]建议使用专业的遥感工具如ENVI或ArcGIS,或者通用工具如Labelme。但Labelme生成的JSON需要转换成单通道的标签图。可能需要编写脚本转换,确保每个类别的像素值正确。 标签格式方面,引用[3]使用单通道8位,像素值对应类别。多类别同理,比如0背景,1建筑,2植被等。需要制作对照表,并检查标注准确性。 数据增强部分,旋转、翻转、色彩调整等,引用[2]提到实际业务中的数据增强方法。可能还需要处理类别不平衡问题,比如过采样或损失函数加权。 数据集划分,按比例分为训练、验证、测试集,确保分布均匀。引用[3]的数据集有150张,可能较小,所以划分时要注意代表性。 此外,质量检查很重要,如引用[2]提到的目视检查和逻辑校验。比如检查标注边界是否准确,是否存在漏标或错标。 最后,生成相关问题时,要考虑用户可能遇到的下一步问题,比如标注工具选择、处理不同分辨率、数据增强技巧等。</think>制作遥感图像多类别语义分割数据集的完整流程可分为以下步骤: ### 一、数据采集与预处理 1. **影像获取** 采集覆盖目标地物类型(如建筑、水体、植被等)的高分辨率遥感影像,需确保影像质量满足以下要求: - 空间分辨率一致(建议统一为0.5-2米级) - 包含多光谱或RGB三通道数据 - 覆盖不同季节、光照条件和地理环境[^2] 2. **影像预处理** - 几何校正:消除地形畸变和投影变形 - 辐射校正:调整光照差异和传感器噪声 - 影像裁剪:将图分割为适合模型输入的尺寸(如512×512像素)[^3] ### 二、标注工具与方法 1. **标注工具选择** - 专业工具:ENVI/ArcGIS的ROI标注模块(支持地理坐标对齐) - 通用工具:Labelme(需后期坐标转换) - 自研工具:开发适配遥感影像特性的标注平台 2. **标注规范制定** ```markdown 类别定义示例: 0 - 背景 | RGB(0,0,0) 1 - 建筑物 | RGB(255,0,0) 2 - 道路 | RGB(0,255,0) 3 - 水体 | RGB(0,0,255) ``` - 需建立类别对照表并规定边界处理规则(如道路与建筑重叠处理) ### 三、标签文件生成 1. **格式转换** 将标注结果转换为单通道索引图: $$ \text{像素值} = \begin{cases} 0 & \text{背景} \\ 1 & \text{类别1} \\ 2 & \text{类别2} \\ \vdots & \vdots \end{cases} $$ 使用Python脚本实现矢量标注到栅格标签的转换: ```python import gdal, numpy as np def vector_to_raster(shp_path, tif_path, output_path): # 读取参考影像地理信息 dataset = gdal.Open(tif_path) # 创建同尺寸单通道标签文件 driver = gdal.GetDriverByName('GTiff') label_ds = driver.Create(output_path, dataset.RasterXSize, dataset.RasterYSize, 1, gdal.GDT_Byte) # 矢量栅格化处理... ``` ### 四、质量检查与增强 1. **质量验证** - 空间对齐检查:叠加原始影像与标签,偏移需小于1像素 - 类别完整性:统计各类别像素占比,避免样本失衡 - 逻辑校验:检查水体与道路的拓扑关系等地理逻辑 2. **数据增强策略** ```python from albumentations import ( HorizontalFlip, RandomRotate90, RandomBrightnessContrast ) train_transform = Compose([ HorizontalFlip(p=0.5), RandomRotate90(p=0.5), RandomBrightnessContrast(p=0.2), ]) ``` ### 五、数据集组织 推荐目录结构: ``` dataset/ ├── images/ │ ├── area1_001.tif │ └── area2_002.tif ├── labels/ │ ├── area1_001.tif │ └── area2_002.tif └── class_mapping.csv ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值