插入排序

一:基本思想

把待排序的元素按其值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。
实际中我们玩扑克牌时,就用了插入排序的思想:

插入排序的整个过程:

解释:

就像打扑克牌一样,我们手里的是已经排好序的牌,然后去摸一张牌来进行插入到排好序的牌,使得整体再度成为一个有序的牌。

二:代码思路

**1:**我们手里的牌要有序

所以我们从一开始空手的时候就对即将摸到的牌进行排序,第一张牌就放在第一位就是有序的,从第二张牌开始就要进行插入排序以确保整体有序。

**2:**从第二张牌开始怎么插入?

假设第二张牌记作tmp,所以tmp要和前一张牌对比,大于等于前一张牌,就放在它的后面,比它小就要继续和前面的牌对比,直到终于遇到大于等于前一张牌的时候,就把tmp停留在前一张牌的后面,但也有可能没有比tmp更小的牌(比如牌里没有3,摸到了3),所以tmp就应该放在最左面。

三:代码展示

arr代表接收的数组,N代表数组的元素数目

cpp 复制代码
//插入排序函数
void InsertSort(int* arr, int N)
{
	for (int i = 0; i < N - 1; i++)
	{
        int end = i;
		//即将排序的元素,保留在tmp
		int tmp = arr[end + 1];
		//end>=0代表还有元素未比较
		while (end >= 0)
		{
			if (tmp < arr[end])
			{
				arr[end + 1] = arr[end];
				end--;
			}
			else
			{
				break;
			}
		}
		//来到这里分为两种情况 
		//1:break->遇到比元素tmp小或和tmp相等的,将m放在它的后面
		//2:全部比较完了,都没有遇到<=tmp的,最后tmp放在数组第一个位置
		arr[end + 1] = tmp;
	}

}

另一种写法:

解释:

**1:**随着我们手里牌的增多,end代表最后一张牌的下标,所以end也会逐渐增多,最后end的下标应该是N-2,也就是倒数第二张牌的下标,然后进行最后一张牌的插入

**也就是:**随着数组元素数目的增加,end也会逐渐增加,最后应该是N-2(数组的倒数第二个元素的下标),然后进行最后一个元素的插入排序

**2:**第二张牌记作tmp,所以tmp要和前一张牌对比,大于等于前一张牌,就放在它的后面,比它小就要继续和前面的牌对比,直到终于遇到大于等于前一张牌的时候,就把tmp停留在前一张牌的后面,但也有可能没有比tmp更小的牌(比如牌里没有3,摸到了3),所以tmp就应该放在最左面。

**也就是:**每次插入排序的end,会随着比较而递减,直接tmp遇到<=自己的元素,或者end为0(代表全部都和tmp进行了比较),才会跳出while

**3:**所以我们把arr[end+1] = tmp;放在了while的外面

这样不管哪种情况都可以完美的进行插入。

end一定是由 i来进行赋值,不能直接把end写到for循环里,因为for内会对end的量进行改变,无法控制!!!

**四:**main函数及效果展示

cpp 复制代码
//主函数
int main()
{
	//生产随机数
	srand(time(0));
	//数组大小为10
	int N = 10;
	//为数组 开辟空间
	int* arr = (int*)malloc(sizeof(int) * N);
	//生成十个随机数,放进数组中
	for (int i = 0; i < N; i++)
	{
		arr[i] = rand() % 100;
	}
	//打印插入排序前的数组
	for (int i = 0; i < N; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	//插入排序
	InsertSort(arr, N);

	//打印排序后的数组
	for (int i = 0; i < N; i++)
	{
		printf("%d ", arr[i]);
	}

	//释放空间
	free(arr);

	return 0;
}
相关推荐
KaMeidebaby4 分钟前
卡梅德生物技术快报|抗体的制备与纯化:分子实验实操:番茄 sHSP 重组表达与抗体的制备与纯化工艺
前端·数据库·人工智能·其他·算法·百度·新浪微博
Han.miracle25 分钟前
Java HashMap 与 ConcurrentHashMap 核心原理总结:从 Hash 冲突到 LongAdder
java·算法·哈希算法
菜菜的顾清寒26 分钟前
力扣HOT100(35)回溯-全排列
算法·leetcode·职场和发展
weixin_4684668531 分钟前
目标识别算法落地实战:从选型到部署的全流程指南
图像处理·人工智能·python·算法·目标检测·机器视觉·目标识别
MicroTech202532 分钟前
微算法科技(NASDAQ :MLGO)量子启发进化算法(QEA)与区块链(BC)集成技术:构建高可靠去中心化创新方案
科技·算法·量子计算
CQU_JIAKE33 分钟前
5.27【A】
算法
江屿风38 分钟前
C++OJ题经验总结(竞赛)3
开发语言·c++·笔记·算法
手写码匠1 小时前
从零手写 SQL 查询引擎:解析器、优化器与执行器实战
人工智能·深度学习·算法·aigc
Tisfy1 小时前
LeetCode 3121.统计特殊字母的数量 II:状态机
算法·leetcode·题解·状态机
zzzsde1 小时前
【Linux网络】传输层协议UDP
linux·服务器·开发语言·网络·算法·udp