今天我们来学习八大排序中的直接插入排序。话不多说,直接上动图。
直接插入排序的主要思想是:当数组只有一个元素的时候,我们可以认为该数组是有序的。所以我们可以选择一个元素放进数组(一般为待排数据的第一个元素)。然后开始排序:找到第二个待排序的数据,把这个元素视为数组里面的元素。(但我们并不知道由于新进一个元素,这个数组是否是有序的)所以要与之前的已经排好序的数组中的元素一一比较,使新数组有序。(假如我们排大序)如果新插入的元素比前一个元素的大,则把新插入的元素放在当前数组的位置然后退出循环(此时数组符合排大序)。如果新插入的元素比前一个元素小,不符合我们排大序的规则,所以我们把前一个元素替换到新插入的元素的位置,同时要保存新插入元素的值(因为新插入元素会被覆盖掉),然后前一个元素的位置视为新插入元素的位置进行与这个位置的前一个位置比较。这样一套下来,我们的新数组就会有序了。然后我们继续添加新的元素放在数组的末尾,重复上面的流程,直到添加完所有待排序的元素为止。
void Insert_Sort(int* arr, int n) //arr存放待排序的数组,n则是数组的元素个数
{
for (int i = 0; i < n - 1; i++)
{
int end = i; // i为当前有序数组的右边界,i + 1则是待排序元素的下标
int tmp = arr[end + 1]; //保存待排序数据的值
while (end >= 0)
{
if (arr[end] > tmp)
{
arr[end + 1] = arr[end]; //如果待插入元素的值小于数组的右边界的值则替换
end--; //数组边界。同时数组的右边界下标减1.
}
else
{
break; //如果当前位置的前一个下标的值小于该插入数据的值,则停止循环
}
}
arr[end + 1] = tmp; //把待插入元素的值放在end + 1下标下,即当前下标的值
}