数据结构算法-插入排序算法

引言

玩纸牌 的时候。往往 需要将牌从乱序排列变成有序排列


这就是插入排序

插入排序算法思想

先看图

首先第一个元素 我默认已有序

那我们从第二个元素开始,依次插入到前面已有序的部分中。具体来说,我们将第二个元素与第一个元素比较,如果第二个元素比第一个元素小,则交换它们的位置。然后再将第三个元素插入到前两个元素已经排序好的部分中,以此类推,直到将最后一个元素插入到整个序列中。这个过程可以

从数组的第二个元素开始遍历,假设当前元素是已排序的序列中的一个正确位置,记为"value"。

往前遍历已排序的序列,如果当前元素大于"value",则将当前元素移至下一位置。这个过程就像在已排序的序列中寻找"value"的正确位置。

当找到"value"的正确位置后,将"value"插入这个位置。

重复以上步骤,直到数组全部有序。

插入排序算法专区

cpp 复制代码
// 定义一个名为InsertSort的函数,它接受三个参数:一个整数数组arr,表示要排序的数组,一个整数size,表示数组的大小,以及一个指向布尔函数的指针Comp。这个布尔函数用于比较两个整数。  
void InsertSort(int arr[], int size, bool (*Comp)(const int&, const int&)) {

	// 检查是否提供了比较函数。如果没有提供(即Comp指针为nullptr),那么直接返回,不进行排序。  
	if (Comp == nullptr) {
		return;
	}

	// 从数组的第二个元素开始遍历,i表示当前处理元素的索引  
	for (int i = 1; i < size; i++) {

		// 将当前索引i的元素保存到变量value中,此元素待插入到已排序的部分  
		int value = arr[i];

		// j表示已排序部分的最后一个元素的索引,它从i-1开始向左移动,寻找插入位置  
		int j = i - 1;

		// 当j大于等于0并且Comp函数返回真(即arr[j]大于value)时,继续向左移动j,同时将arr[j]元素向右移动一位  
		while (j >= 0 && Comp(arr[j], value)) {
			arr[j + 1] = arr[j];
			j--;
		}

		// 找到了插入位置,将value插入到j+1的位置上  
		arr[j + 1] = value;
	}
}

// 定义一个名为GreaterCmp的函数,它接受两个const int&类型的参数val1和val2,返回值为bool类型。当val1大于val2时返回true,否则返回false。  
bool GreaterCmp(const int& val1, const int& val2) {
	return val1 > val2;
}

// 定义一个名为LessCmp的函数,它接受两个const int&类型的参数val1和val2,返回值为bool类型。当val1小于val2时返回true,否则返回false。  
bool LessCmp(const int& val1, const int& val2) {
	return val1 < val2;
}
相关推荐
小小小小王王王23 分钟前
求猪肉价格最大值
数据结构·c++·算法
岁忧1 小时前
(LeetCode 面试经典 150 题 ) 58. 最后一个单词的长度 (字符串)
java·c++·算法·leetcode·面试·go
BIYing_Aurora1 小时前
【IPMV】图像处理与机器视觉:Lec13 Robust Estimation with RANSAC
图像处理·人工智能·算法·计算机视觉
martian6652 小时前
支持向量机(SVM)深度解析:从数学根基到工程实践
算法·机器学习·支持向量机
孟大本事要学习3 小时前
算法19天|回溯算法:理论基础、组合、组合总和Ⅲ、电话号码的字母组合
算法
SuperW3 小时前
数据结构——队列
数据结构
??tobenewyorker3 小时前
力扣打卡第二十一天 中后遍历+中前遍历 构造二叉树
数据结构·c++·算法·leetcode
让我们一起加油好吗3 小时前
【基础算法】贪心 (二) :推公式
数据结构·数学·算法·贪心算法·洛谷
蓝澈11213 小时前
迪杰斯特拉算法之解决单源最短路径问题
java·数据结构
贾全4 小时前
第十章:HIL-SERL 真实机器人训练实战
人工智能·深度学习·算法·机器学习·机器人