活动地址:CSDN21天学习挑战赛
一、插入排序算法
1.插入排序算法概述
插入排序时将无序子序列中一个或几个记录“插入”到有序序列中,从而增加记录的有序子序列的长度。
一趟直接插入排序的基本思想(如下图)
实现“一趟插入排序”可分为三步进行:
1)在R[1...i-1]中查找R[i]的插入位置,R[1...j]<R[i]<R[j+1...i-1]
2)将R[j+1...i-1]中所有记录均后移一个位置
3)将R[i]插入到R[j+1]的位置
不同的具体实现方式导致不同的算法描述
- 直接插入排序(基于顺序查找)
- 折半插入排序(基于折半查找)
- 希尔排序(基于逐趟缩小增量)
2.直接插入排序
1)输入:n个数的序列,通常直接存放在数组中,顺序不定。
2)过程:
每次从无序序列中取出一个数,插入到已经排好的有序序列中,直到所有的书全部取完,同时新序列也排列好了。
3)输出:输出序列为一个新的排列,满足从小到大的顺序
3.伪代码
for j = 2 to A.length
key = A[j]
i = j - 1
while i > 0 and A[i] > key
A[i + 1] = A[i]
i = i - 1
A[i + 1] = key
二、算法实现
对顺序表L作直接插入排序
void InsertSort(SqList *L)
{
int i,j;
for(i=2;i<=L=>Length;i++)
{
if(L->R[i]<L->R[i])//需要插入
{
L->R[0]=L->R[i];//设置哨兵
for(j=i-1;L->R[i]>L->R[0];j--)
L->R[j+1]=L->R[j];
L->R[j+1]=L->R[0];
}
}
}
2.分析直接插入排序时间性能
实现内部排序的基本操作有两个:
1)比较序列中两个关键字的大小
2)移动记录
- 最坏的情况:关键字在记录序列中逆序有序
比较次数:(n+2)(n-1)/2 移动次数:(n+4)(n-1)/2
时间复杂度为O(n^2)
- 最好的情况:关键字在记录序列中顺序有序
比较次数:n-1次 移动次数:0次
时间复杂度为O(n)
- 平均情况
综合两种情况插入排序时间复杂度为O(n^2)