插入排序C语言版(一位小白的学习感悟)

插入排序

基本思想:大部分人对于插入排序的思想在于“***每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。***”个人觉得,这个思想比较易于初学者理解整个算法的思想,但是经过阅读一些大佬的代码,发现代码还可以有另一种理解方式。其方式和原来的叙述方法实质是一样的,但可能更易于理解代码。

先上代码

void Insert_sort(int *arr,int len)          // arr为数组名,len为数组长度
{
	int tmp,i,j;
	for (i = 1;i < len;i++)
	{
//如果当前值不是第一个数(j>=0)而且此时前面的那一个数比当前值大
//则前面的较大的数往后平移
		tmp = arr[i];                             //先把当前值赋值给哨兵
		for (j = i - 1;j >= 0 && arr[j] > tmp;j--)   //平移(其实也可以用while循环平移)
		{
			arr[j + 1] = arr[j];
		}
		arr[j + 1] = tmp;                        //将哨兵赋值给其应该在的位置
	}      //进行下一个数判断
}

代码解释
经过阅读代码可以看出,本代码实际上分为以下几步:

  1. 第一个for用来遍历数组中所有的数,然后对于每一个数进行for里面的步骤;
  2. 首先将当前的数赋值给哨兵tmp;
  3. 第二个for实际上也包含判定,判定当前的数是否小于前面与它相同的数,如果小于就将前面的数往后平推,直到推到当前数的后一个数小于或者等于哨兵(当前在判定的数),所以说第二个for()实际上可以改成
j=i-1;
while(a[j]>tmp)
{......}
  1. 把哨兵的值赋给a[j+1];
  2. 继续下一轮循环…;

新的思想

与其说是把“每一步待排序的对象插入到前面已经排好序的对象里”,不如说是一个数一个数往前插,从第二个数开始(换句话说就是先把第一个数放入之前所谓的“排好序的对象”),一直与之前所有的数进行比较,直到插入目前来看前面所有数的正确位置。这样就保证了前面所有数是“已排好序”,外层for进行到哪里,哪里就是“排好序”和“没排好序”的分界线。就像是搭积木一样,一点一点的往上比,并且插入。

如图片所示:

如图所示其实笔者也只是一个数据结构小白初学者,只是在这里写一下自己学习过程中的一些感悟,还望各位大佬指出其中的错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值