排序 —— 直接插入排序

算法思想

将一个记录插入到已排序好的有序表中(同时要巴原来位置上的元素向后顺移),从而得到一个新的记录数增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中暂存的待排关键字插入
	}
}

猜你喜欢

转载自blog.csdn.net/starter_____/article/details/93748845