失踪了几个月,本来的目的是想写一个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,不知道具体原因
mathjax测试
Dollar Signs: $y=mx+1$
Parenthesis: \(y=mx+2\)
Double Dollar Signs: $$y=mx+3$$
Hard Bracket: \[y=mx+5\]
Line By Line:
$\lim_{x \to \infty} \exp(‐x) = 0$
$\cos (2\theta) = \cos^2 \theta ‐ \sin^2 \theta$
$a \bmod b$
$x \equiv a \pmod b$In a sentence
When $a \ne 0$, there are two solutions to (ax^2 + bx + c = 0) and they are
$$x = {-b \pm \sqrt{b^2-4ac} \over 2a}.$$SRC
1
2
3
4
5
6
7
8
9
10
11
12- Dollar Signs: $y=mx+1$
- Parenthesis: \\(y=mx+2\\)
- Double Dollar Signs: $$y=mx+3$$
- Hard Bracket: \\[y=mx+5\\]
- Line By Line:
$\lim_{x \to \infty} \exp(‐x) = 0$
$\cos (2\theta) = \cos^2 \theta ‐ \sin^2 \theta$
$a \bmod b$
$x \equiv a \pmod b$
- In a sentence
When $a \ne 0$, there are two solutions to \(ax^2 + bx + c = 0\) and they are
$$x = {-b \pm \sqrt{b^2-4ac} \over 2a}.$$