将一个元素插入到一个有序序列中,使插入之后的序列仍然有序,是插入排序的核心思想。
概述
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据。我们将待排序数组分为前(有序)后(无序)两部分,每次从后一部分取一个数据,然后在前一部分找其对应位置,找到后将其置入,然后增加有序部分的长度,持续这样的操作,直到整个序列有序。
原理详解
以排升序为例。
如上图所示,插入排序具体步骤可描述为如下:
- 用
key
将待插的元素储存;- 从后往前,依次将
key
与有序序列中的元素(用cur标记)比较,若key
比该元素小,则将其向后移动一个位置;- 直到发现发现一个元素小于(等于)
key
(或者超出数组范围),则此时已经找到了插入位置(下标为cur+1
),将其插入。- 有序序列长度加1,重复上述步骤,直至整个序列有序。
时间复杂度:对于长度为 N 的序列,我们需要进行 N-1 此插入,而且每次插入,最坏情况需要挪动所有有序序列元素,而最好情况则是不需挪动元素,故它的平均时间复杂度为:O(n^2),由于相同元素在排序前后其相对位置不会发生变化,故该排序算法是稳定的。
C代码实现
void InsertSort(int *a, size_t n)
{
//把第i个数插入到[0, i-1]有序区间内,使插入后的序列人保持有序
for (size_t i = 1; i < n; ++i){
int key = a[i];//
size_t cur = i - 1;
while (cur >= 0 && key < a[cur]){
a[cur + 1] = a[cur];
--cur;
}
a[cur+1] = key;
}
}
——完!
【作者:果冻 http://blog.csdn.net/jelly_9】