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))