插入排序工作方式:就像许多人排序一手扑克牌一样。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入到左手正确的位置。为了找到一张牌正确的位置,我们从右到左将它与已在左手的每张牌进行比较。
代码如下:
#include <stdio.h>
#include <stdlib.h>
void insert_sort(int *pArr, int iLow, int iHigh)
{
for(int i = iLow + 1; i <= iHigh; i++)//第一个元素不需要比较,因此从第二个元素开始遍历
{
int key = pArr[i];
int j = i - 1;
while(j >= iLow && pArr[j] > key)
{
pArr[j + 1] = pArr[j];
j--;
}
pArr[j + 1] = key;
}
}
int main()
{
int arr[] = {5,4,3,2,1};
insert_sort(arr, 0, sizeof(arr)/sizeof(int) - 1);
for(int i = 0; i <= sizeof(arr)/sizeof(int) - 1; i++)
{
printf("arr[%d]=%d\n", i, arr[i]);
}
}
运行的结果如下:
插入排序的时间复杂度(为了方便解析截出主要代码):
因为求时间复杂度都是假设最坏的情况的,因此假设:
执行第6行的代价为c1,其一共执行n次。
执行第8~9行和第15行的代价为c2,其执行n - 1次。
执行第10行的代价为c3,其执行n*(n+1)/2 -1。
执行第12~13行的代价为c4,其执行n*(n-1)/2次。
则T(n) = c1*n + c2*(n -1) + c3*(n*(n+1)/2 - 1) + c4*(n*(n-1)/2 ) = ((c3+c4)/2)*n^2 + (c1 + c2 + c3/2 - c4/2)*n - (c3 + c4) =
所以:插入排序算法时间复杂度T(n) = a*n^2 + b*n +c = O(n^2)