失踪了几个月,本来的目的是想写一个cms,最起码能实现小说平台和博客平台的。断断续续写了一个多月,后端是写出来了,但是数据库设计问题最终还是没有用上,又花时间搭了一套DroneCI+gitea的配置,最终实现了commit&&push后自动部署虽然有简单的方法,但是兴许以后用得上CI呢。其他时间就在看看算法课啊学学编程基础啥的。算法第四版是真的很适合我这种学不会算法,看见算法就感觉失了智的人
希尔排序理念
在算法第四版讲解希尔排序之前,这本书先教会了读者使用插入排序。随后又引入了间隔的概念——将固定间隔的元素编排成数组,对此数组进行插入排序,随后将间隔按照规定不断减小直到0并在此过程中对对应的数组进行排序,最后算法便退化为插入排序。
为什么要使用希尔排序
实际上,对于局部有序(或是大多部分下有序)的数组,排序所需要的移动和比较次数是线性的(与倒序对个数相同)。又因为插入排序的底层实现是对于a[i],若a[i-1]>a[i],则交换,直到a[i-1]<a[i],这意味着在最坏的条件下一个元素需要移动N次才能回到正确位置。最坏情况下(倒叙)的比较次数与交换次数都为
$$
\sim\frac{N^2}{2}
$$
所以,通过引入希尔排序,在间隔>0时,数组可以变得部分有序,最后当间隔=0时,希尔排序退化为插入排序,此时插入排序面对的就是部分有序的数组,可以更快排序,根据此书的解释,作为插入排序的改良,希尔排序在最差情况下的比较次数与
$$
N^{3/2}
$$
成正比。
选定适合的h数
这里我不是很理解
此处的h数即为
将间隔按照规定不断减小
中的规定
,h按照减幅k进行缩小,其他博客列出的k多为2,但是我看书中的k为3,不知道具体原因