插入排序
基本思想:大部分人对于插入排序的思想在于“***每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。***”个人觉得,这个思想比较易于初学者理解整个算法的思想,但是经过阅读一些大佬的代码,发现代码还可以有另一种理解方式。其方式和原来的叙述方法实质是一样的,但可能更易于理解代码。
先上代码
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; //将哨兵赋值给其应该在的位置
} //进行下一个数判断
}
代码解释
经过阅读代码可以看出,本代码实际上分为以下几步:
- 第一个for用来遍历数组中所有的数,然后对于每一个数进行for里面的步骤;
- 首先将当前的数赋值给哨兵tmp;
- 第二个for实际上也包含判定,判定当前的数是否小于前面与它相同的数,如果小于就将前面的数往后平推,直到推到当前数的后一个数小于或者等于哨兵(当前在判定的数),所以说第二个for()实际上可以改成
j=i-1;
while(a[j]>tmp)
{......}
- 把哨兵的值赋给a[j+1];
- 继续下一轮循环…;
新的思想
与其说是把“每一步待排序的对象插入到前面已经排好序的对象里”,不如说是一个数一个数往前插,从第二个数开始(换句话说就是先把第一个数放入之前所谓的“排好序的对象”),一直与之前所有的数进行比较,直到插入目前来看前面所有数的正确位置。这样就保证了前面所有数是“已排好序”,外层for进行到哪里,哪里就是“排好序”和“没排好序”的分界线。就像是搭积木一样,一点一点的往上比,并且插入。
如图片所示:
其实笔者也只是一个数据结构小白初学者,只是在这里写一下自己学习过程中的一些感悟,还望各位大佬指出其中的错误。