一、算法原理
通常人们整理扑克牌的方法就是一张一张来,将每一张扑克牌插入到已经有序的牌中的适当位置。为了给要插入的元素腾出空间,需要将这个位置之后的全部元素在插入之前都向后移动一位。这种算法就是插入排序(Insert sort)。与选择排序相同的是,当前位置左边的元素都是排序的,但它们的最终位置还不确定,为了给更小(或更大)的元素腾出位置,它们可能会被移动。当索引到达数组尾部时,数组排序就完成了。和选择排序不同的是,插入排序所需时间取决于初始顺序,对一个很大但其中元素已经基本有序的数组进行插入排序会比随机顺序的数组进行排序要快得多。
二、算法描述
- 假定将数组按升序排序
- 从第一个元素开始,可以认为该元素已经有序
- 扫描下一个元素,在已经排序的数组中从后往前比较,如果该元素小于前面的元素,就将它们交换
- 重复上个步骤,当该元素大于或等于前面的元素或者到达数组首端时就停止扫描,该位置就是此元素在已排序数组中所在位置
- 继续扫描下一个元素,重复上述步骤
三、算法复杂度分析
- 插入排序的时间效率取决于输入数组的初始情况,输入数组部分有序性越好,插入排序的效率就越高。对于完全随机位置的数组或是降序倒置的数组,插入排序的时间效率与选择排序差不多。
- 时间复杂度最坏情况T(n) = O(n^2),最好情况T(n) = O(n),平均情况T(n) = O(n^2)
- 空间复杂度是O(1)
四、示例代码
//插入排序
void InsertSort(int a[], int length)
{
if (a == NULL || length <= 0)
{
printf("输入数组错误!\n");
return;
}
for(int i = 1; i < length; ++i)
{
for (int j = i; j > 0 && a[j] < a[j-1]; j--)
{
int temp = a[j-1];
a[j-1] = a[j];
a[j] = temp;
}
}
}