插排的非递归很简单,用两层循环即可搞定,因此时间复杂度为O(n^2),空间复杂度为O(1)。
代码如下:
void InsertSort(int* pArr, int len)
{
if (len<2)
return;
int key, j;
for (int i = 1; i < len; ++i )
{
key = pArr[i]; //记录当前要排序的元素
for (j = i-1; j >= 0; --j)
{
if ( key >= pArr[j] )
break;
else
pArr[j+1] = pArr[j];
}
pArr[j+1] = key;
}
}
插排递归实现,可以调用自身n-1次,找到之后n-1个元素的正确位置插入进去,时间复杂度也是O(n^2),空间复杂度为O(n)。
代码如下:
//将pArr数组中的第index位元素放入到其已排好序的数组中,数组总长度为len
void InsertSortRecursion(int* pArr, int index, int len)
{
if (len<2) //仅有一个元素无需排序
return;
int key = pArr[index]; //待排序元素
int i = index-1; //已排好序的最后一位元素下标
if ( index < len )
{
for (; i>=0; i--)
{
if ( key >= pArr[i] )
break;
else //当前位赋值到下一位上
pArr[i+1] = pArr[i];
}
pArr[i+1] = key; //将key放入正确的位置
InsertSortRecursion(pArr, index+1, len);
}
}
个人观点:
不建议使用递归写插排,之所以去实现是因为笔试中,要求写插排递归实现。