目录
一、什么是插入排序
将有序数组后面的数据插入到有序数组中间,使其构成新的有序数组,这就是插入排序。就好比我们打扑克牌时,摸起来一张牌将其插入到手牌中。摸起来的牌就是有序数组后面的数据,有序数据就是我们的手牌。
我们要做的就是将2插入到1的后面;如何做呢?(以升序为例)
二、 怎样进行单趟插入排序
挤进去肯定是不行的,数组就那么大,所以我们要做的就是挪数据,一个一个往后挪然后空出来1后面的那个位置给2。
1、先将2保存起来----------------->用tmp = a[end+1]保存
2、将6挪至2所在的位置--------->a[cur + 1] = a[cur];
3、将5挪至6所在的位置--------->cur--;
a[cur + 1] = a[cur];
4、将保存的数据(即2)放入5所在的位置--------->
完成单趟的插入排序。
三、怎样完成多趟插入排序
当end是3时,第二步就会将下标为4的数据插入进有序数据中;
当end是4时,第二步就会将下标为5的数据插入进有序数据中;
……
当end是len-2时,第二步就会将下标为len-1的数据插入进有序数据中;(数组长度为len,最后一个元素的下标为len-1)
这样就可以完成多趟排序。
总结一下:
从0开始一直到len-2;一次一次更新end的值来讲一个一个的数据插入有序数据中。
四、临界条件是什么
由第二点可以得出,让无序数据 a[end+1] 向前插入的条件是有序数据 a[cur] 大于此无序数据。
但是还有一种特殊情况是:cur走到了数组的头,仍然没有找到:
这也是让循环结束的一种情况。
总结一下,单趟插入排序注意的点:
1、只有序数数据一直大于这个无序数据时才能让cur往前走寻找
2、走到数组结束也没找到那就说明这个无序数据是目前有序数据中的最小值
但是这两种情况都是一样的:a[cur+1] = tmp;
核心代码:
void InsetSort(int* a, int n)
{
for (i = 0; i < n - 1; i++)
{
//假设[0,end]是有序的,下一个待排序元素是a[end+1]
int end = i;
int tmp = a[end + 1];
while (end >= 0)
{
if (Compare(a[end],tmp))//可以使用回调函数改变升序还是降序
{
a[end + 1] = a[end];
end--;
}
else
{
break;
}
}
//1、有序数据都小(大)于a[end+1]
//2、一直到end = -1,都没找到比a[end+1]小的数
a[end + 1] = tmp;
}
}
五、怎样在一个排序函数中实现升序降序
https://blog.csdn.net/leadera_/article/details/128473953?spm=1001.2014.3001.5501