插入排序

Sorting大体共分五类:

1、插入排序

2、交换排序

3、选择排序

4、归并排序

5、计数排序


本文介绍插入排序:

一、直接插入排序(Straight Insertion Sort)

需要一个监视哨,一般设在0位置处。

大意:

        先把第i个位置的元素放入监视哨(i从2开始,i<=N),如果第i个比第i-1个数小,

那么 第i-1个数赋值给第i个,并且从i-2开始,直到r[0](待排序的数字在监视哨内)大于r[j]位置,所有数字后移

L.r[j+1] = L.r[0]


适用范围:n比较小

空间需要:一个监视哨

时间复杂度:O(n^2)  后面介绍的插入排序时间复杂度都相同


二、折半插入排序(Binary Insertion Sort):

与折半查找类似,折半查找所需要插入的点,后从该点开始,全部后移。

需要设置low与high指针。


三、2-路插入排序

设置first指针与final指针,分别把两个数放在开始和结尾。final放在前面,first放在后面。

如果比r[0]数大的就把他放在前面重新排列,final指针移动。

如果比r[0]小的就把他加入到后面与first组合起来重新排列。

最后first指向最小的数,final指向最大的数。first到数组尽头后从r[0]继续数。

移动次数约为n^2/8,减少了移动记录的次数,但扔不可避免地移动记录。


四、表插入排序

初始化,把r[1]与r[0]设置为循环链表内的元素,其中r[0]为MAXINT,在列表中始终占有最大的位置。逐步插入到链表中应该插入的位置。

优点:不再需要移动元素。

缺点:查找比较麻烦,不能随机查找,可以把所有元素重新写入数组中。


五、希尔排序(Shell's Sort)

注:在时间复杂度上不同于其他插入排序。

希尔排序没有简单地分隔子序列,而是采用增量的方式组成子序列。

如:10个元素:

第一趟排序分成五个子序列:1,6   /   2,7   /   3,8  /   4,9 /   5,10

第二趟排序分成三个子序列:1,4 ,7,10   /  2,5,8   /   3,6,9

第三趟完成全部排序。

为什么快了,是尚未解决的数学难题。增量的取法不同,时间复杂度也不同,感兴趣可以深入研究一下。比较次数和移动次数大约为n^1.3。

当增量序列为dlta[k]=2^(t-k+1)  -  1时,其中t为趟数,时间复杂度O(n^(3/2))


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章