直接插入排序的思路是这样的:假设前i个数已经排好,将第i+1个数依次和前面的数进行比较,如果array[i+1]小于array[j],则将array[i+1]插入到array[j]的前面,插入过程是这样的,将array[i+1]储存到tmp中,然后array[j]到array[i]之间的数后整体后移一位,然后将tmp中的值赋给array[j]。代码如下:
void InsertSort(int Array[], int k)
{
int i;
int j;
int n;
int tmp;
for(i = 0; i <=k-2; ++i)
for(j = 0; j <=i; ++j)
{
if(Array[i+1] < Array[j])
{
tmp =Array[i+1];
for(n = i ; n>=j; --n)
Array[n+1] = Array[n];
Array[j] = tmp;
break;
}
}
}
分析下上面的代码,每次循环开始时,前面已经排好序的数和当前的数都要一一进行比较,如果当前的数大于前面排好的序列的最大的数,那么这个比较就显得很多余了,所以上面的算法实现效率是比较低的。下面是改进的插入排序
void InsertSortIpr( int Array[ ], int k)
{
int i;
int j;
int tmp;
for(i = 0; i <= k-2; ++i)
if(Array[i+1]< Array[i])
{
tmp = Array[i+1];
for(j = i; Array[j] > tmp&&j>=0; --j)
Array[j+1] = Array[j ];
Array[j+1] = tmp;
}
}
时间复杂度:
最好情况:
排好序了已经,n
最坏情况: o(n^2),直接插入法比冒泡法和简单的选择排序发效率要高些。
空间复杂度:常数