插入排序的原理与打扑克摸牌一致,当一张新牌来时,我们会选择一个合适的位置插入,插入排序算法原理类似,当数据的前半部分有序时,依次遍历后半部分的数据,将每个无序数据插入到前面有序部分中。
在此处,我们用双链表的方式实现该算法。其中链表的构造过程与之前博客中选择排序部分一致,在此不做赘述。下面,看一下选择排序的代码:
void insertsort(node2* head, node2* tail) {
node2* pos = head->after->after;
while (pos != tail)
{
node2* insert = pos->before;
while (insert->value>pos->value)
{
insert = insert->before;
}
node2* temp = pos;
pos->before->after = pos->after;
pos->after->before = pos->before;
pos = pos->after;
temp->before = insert;
temp->after = insert->after;
insert->after = temp;
temp->after->before = temp;
}
}
在此,插入过程我们没有用二分查找的原因在于,二分查找适用于数组,因为数组方便读取数据,链表中二分查找没有优势。那么,为什么不直接用数组来做插入排序算法呢?这是因为,如之前博客中对数组和链表的分析,插入数据时,数组需要移动n个数据,而链表只需要处理当前节点就可以。
插入排序总的说来,最坏和平均时间复杂度均为o(n^2)最好的情况下时间复杂度为o(n),对比选择排序,选择排序即使在最好情况下,时间复杂度也为o(n^2)