考研数据结构插入排序|一、直接插入排序

337 阅读2分钟

这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战

插入排序

基本思想:每次将一个待排序的记录,按其关键字大小插入到前面已排好序的子序列中,直到全部记录插入完成

一、直接插入排序

待排序表L[n]在某次排序过程中的某一刻状态如下:

image.png

将L[i]插入到已有序对的子序列L[1,2,...,i-1]中的操作步骤如下:

① 查找出L[i]在子序列中的插入位置k

②将L[k,k+1,...,i-1]中所有元素全部后移一个位置

③ 将L[i]复制到L[k]

初始可假定L[1]是一个已排好的子序列,然后依次将L[2]~L[n]依次插入 到前面已排好的子序列中,执行n-1次插入后即可得到一个有序表

直接插入排序代码实现

将L[i]插入到已有序对的子序列L[1,2,...,i-1]中的操作步骤如下:

① 查找出L[i]在子序列中的插入位置k

②将L[k,k+1,...,i-1]中所有元素全部后移一个位置

③ 将L[i]复制到L[k]

void  InsertSort(ElemType  A[],int  n){
int  i,j;
for(i = 2;i<=n;i++)
if(A[i].key<A[i-1].key){
A[0]=A[i];
for(j=i-1; A[0].key<A[j].key; --j)
A[j+1]=A[j]; 
A[j+1]=A[0];
}
}

image.png 注意:

  • A[0]称为“哨兵”,可帮助加快查找待插入位置k
  • 空间复杂度为O(1),即该算法是就地算法
  • 最好时间复杂度:表中元素已有序,此时每个元素只比较一次且不需要移动元 素,故最好时间复杂度O(n)
  • 最坏时间复杂度:表中元素逆序,此时对第i个元素,比较次数是i次,移动次 数是i+1,故整个表中n个元素执行比较和移动的总次数为: 𝑖=2𝑛 𝑖 +𝑖 +1 = 𝑛2 +2𝑛−3,故最坏时间复杂度为O(𝑛2)
  • 平均时间复杂度:待排序元素随机,此时总的比较次数和移动次数均约为𝑛2/4,故平均时间复杂度为O(𝑛2)
  • 稳定性:直接插入排序是稳定的排序方法
  • 适用性:适用于基本有序的排序表,顺序存储和链式存储均可,当链式存储时可从前往后查找待插入位置k