插入排序对于少量元素的排序,是一个有效的算法。插入排序的工作方式像许多人排序一手扑克牌。开始时我们左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较,默认拿到左手的牌总是排序好的。
输入:n个数的一个序列<a1,a2,…,an>
输出:输入序列的一个排列<a1’,a2’,…,an’>,且满足a1’ <= a2’ <= …<= an’
算法描述如下
INSERTION-SORT(A)
for j = 2 to A.length
key = A[ j ]
i = j - 1
while i > 0 and A[i] > key
A[ i + 1 ] = A[ i ]
i = i - 1
A[ i + 1 ] = key
C语言实现如下
void insertion-sort(int *arr, int n)
{
int i, j, key;
for( i = 1 ; i < n ; i++ )
{
key = arr[i];
j = i;
while( j > 0 && arr[ j - 1 ] > key)
{
arr[ j ] = arr[ j - 1 ];
j--;
}
arr[ j ] = key;
}
}
效率
插入排序在最好的情况下,需要比较 n - 1 次,不需要进行交换,时间复杂度为O(n);在最坏的情况下需要比较 n (n-1) / 2 次,故时间复杂度为 O(n^2)。