学过数据结构的我们,对于算法肯定都不陌生。算法在IT界有着不可或缺的作用。下面我们就挨个来说一下算法家族的亲们!
今天就先说插入排序吧。
常见的插入排序有:直接插入排序,希尔排序,折半插入排序,表插入排序。对于前两种我们多多少少接触过。
(一)直接插入排序
直接插入排序算是一种最简单的插入排序了。它的基本思想是一次将每个记录插入到一个已排好序的有序表中去,得到一个新的有序表。光说概念可能就抽象,我们来看一个直接插入排序的例子:
明白了基本排序原理,我们再来看一下它的算法:
void InsertSort(SqList &L){
//对顺序表L进行直接插入排序
for (i=2;i<=L.length;i++){ //从第2个元素起进行插入
L[0]=L[i]; //第i个元素复制为岗哨
j=i-1; //j为岗哨前元素个数,即岗哨与之比较的个数
while (L[0].key<L[j].key) //第j个元素与岗哨进行比较,至值不大于岗哨时
{ //前i-1个数都是从小到大的有序序列,所以只要当前比较的数比岗哨大,就把这个数后移一位
L[j+1]=L[j];
j--;
}
L[j+1]=L[0]; //将第i个记录插入到序列中
}
if()
}
算法分析:
(1)时间复杂度:
当数据正序时,执行效率最好,每次插入都不用移动前面的元素,时间复杂度为O(N)。
当数据反序时,执行效率最差,每次插入都要前面的元素后移,时间复杂度为O(N2)。
所以,数据越接近正序,直接插入排序的算法性能越好。
(2)空间复杂度:
由于排序过程中,我们只需要一个临时变量存储要插入的值,所以空间复杂度为1.
(3)稳定性:
在排序过程中,不改变相等数值元素的位置,所以直接插入排序是稳定的算法。
综上:
(二)希尔排序
相对于直接插入排序来说,希尔排序就有些复杂了。它是直接插入排序的改进,又称缩小增量排序。我们先来看一下希尔排序的排序过程:
如下图,
1.首先将序列分为5个子序列,(R1R6,R2R7,R3R8,R4R9,R5R10),对这5个子序列分布进行直接插入排序,得到第一趟。
2.然后对3个子序列(R1R4R7R10,R2R5R8,R3R6R9)进行直接插入排序,得到第二趟。
……
算法分析: