插入排序笔记

1.直接插入排序

1)手动排序举例
  1. 有序表初始从第一个元素(到第二趟为[5 64])
  2. 借助哨兵,后面的待插入元素从有序表末尾依次进行比较(将 7 插入有序表)
  3. 直到大于某一值(5)后,将该值下一个位置的值放到7的位置
  4. 将放在哨兵位置的待插入值(7)放到原来64的位置
0123456
第0趟(哨兵)5[ 64 ]5789624
第1趟7[ 564 ]789624
第2趟89[ 5764 ]89624
第3趟6[ 576489 ]624
第4趟24[ 5676489 ]24
第5趟[ 567246489 ]
2)代码实现
for(int i = 2; i<A.length; i++){         //  n次
	r[0] = r[i];                         // n-1次
	j = i-1;                             // n-1次
	while(r[0]<r[j]){                    
		r[j+1] = r[j];                   
		j = j-1;                         
	}
	r[j+1] = r[0];                       // n-1次
}
3)效率分析
a.时间复杂度分析

如代码部分分析,其中未分析的4、5、6行复杂度可分别写为:
∑ i = 2 n   t j \sum_{i=2}^{n}\ t_j i=2n tj ∑ i = 2 n   ( t j − 1 ) \sum_{i=2}^{n}\ (t_j-1) i=2n (tj1) ∑ i = 2 n   ( t j − 1 ) \sum_{i=2}^{n}\ (t_j-1) i=2n (tj1)
最好情况为(顺序)while循环每次只执行一次,即 t = 1 t = 1 t=1,时间复杂度为 5 n − 2 5n-2 5n2,即 O ( n ) O(n) On
最坏情况为(逆序)while循环每次执行i次,即t=i,时间复杂度为 n 2 + ( 2 + n ) ( n − 1 ) / 2 + 3 n + 3 n^2+(2+n)(n-1)/2+3n+3 n2+(2+n)(n1)/2+3n+3,即 O ( n 2 ) O(n^2) On2
平均时间复杂度也为 O ( n 2 ) O(n^2) On2

b.空间复杂度分析

由于只应用到监视哨r[0],因此空间复杂度为 O ( 1 ) O(1) O1

c.稳定性

相等时不满足移动条件,因此,该排序算法为稳定性算法

2.折半插入排序

3.希尔排序

与折半插入排序都是直接插入排序的改进
设置增量,根据增量进行直接排序

01234567891011
1625123047112336091831
d=51123120918162536304731
d=30918121123162531304736
d=10911121618232530313647

复杂度是关于增量的函数,增量至今没有统一标准。
该方法只可得到局部复杂度结论,无法得到全局复杂度。
该方法不稳定。


如有错误望订正>_<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值