当前位置:网站首页>带你了解直接插入排序(C语言)

带你了解直接插入排序(C语言)

2022-06-11 11:41:00 Butayarou

引入:
其实它和玩扑克牌的原理是一样的(用升序来举例):先拿第一张牌,再拿第二张牌,从后往前比较,此时只能与第一张牌比较(如果第二张牌的点数更大,把它放在第一张牌的后面,否则放在前面),然后拿第三张牌,将它从后往前比较,把它插入到合适的位置,使手上的牌仍然保持升序,接下来的牌都跟前面的操作相同。

基本思路:让 end 指向第一个数,先用 tmp 保存下标为(end + 1)的数,再将 tmp 依次与
下标从 end 到 0 的数(从后往前)比较(符号方向依是升序还是降序来定,且该步需要挪动元素),把 tmp 存的值插入到合适的位置。
将上面的基本思路做成一个循环(让 end 的指向范围为 [ 0 , n-1 ] )

可以发现,
手上现有的牌 ---------------->下标从 0 到 end 的元素

tmp ----------------> 新拿的一张牌

从后往前比较,将牌插入到合适的位置 ----------------> 将 tmp 与 下标从 end 到 0
的元素比较(需要挪动元素),把 tmp 存的值插入到合适的位置

于是,每执行完一次循环后,下标从 0 到 end 的元素都是有序的。

代码实现

void InsertSort(int* a,int n)
{
    
	for (int i = 0; i < n - 1;i++)
	{
    
		int end = i;  //赋值给end,使得end位置后移,外扩
		int tmp = a[end + 1];
		while (end >= 0)
		{
    
			if (a[end] > tmp)
			{
    
				a[end + 1] = a[end];
				end--;  //靠end后退来实现两数比较
			}
			else
				break;
		}

		a[end + 1] = tmp;
	}
}

更多文章
让你理解选择排序(C语言)
让你搞懂冒泡排序(C语言)

原网站

版权声明
本文为[Butayarou]所创,转载请带上原文链接,感谢
https://blog.csdn.net/m0_59938453/article/details/121318098