算法思想
将一个记录插入到已排序好的有序表中(同时要巴原来位置上的元素向后顺移),从而得到一个新的记录数增1的有序表。
算法过程
算法性能分析
(1)时间复杂度分析
无论什么情况,外部循环始终逐一执行,外部循环次数为n
-
考虑最坏的情况,即整个序列都是逆序的,则内层循环需要逐一执行,内部循环次数为(n-1)/2,故总循环次数为 n(n-1)/2,其算法复杂度是 O(n^2)
-
考虑最好的情况,即整个序列都是顺序的,则内层循环均不需要执行,双层循环变成了单层循环,故总循环次数为 n,其算法复杂度是 O(n)
-
对于平均的情况,其算法复杂度是 O(n^2)
(2)空间复杂度分析
算法所需要的辅助存储空间不随待排序列的规模的变化而变化,是个常量,因此空间复杂度为 O(1)
(3)稳定性
若两个记录A和B的关键字值相等,A先插入,B后插入,此时排序后A、B的先后次序保持不变,因此称此排序算法是稳定的。
实现
void insertSort(int R[],int n) //待排关键字存储在R[]中,个数为n
{
int i,j;
int temp;
for(i=0;i<n;i++)
{
temp=R[i];
j=i-1;
while(j>=0&&temp<R[j])
{
R[j+1]=R[j]; // 将原来位置上的元素向后顺移
--j;
}
R[j+1]=temp; // 找到插入位置,将temp中暂存的待排关键字插入
}
}