数据结构和算法动态可视化 :https://visualgo.net/zh
有问题1062290728@qq.com
选择排序
概述:
首先,找到数组中最小的那个元素,其次,将它和数组第一个元素交换位置。接着,在剩下元素中找到最小的元素,将它与数组第二个元素交换位置。如此往复,直到将整个数组排序。

命题:
- A :对于长度为N的数组,选择排序需要大约N2/2次比较和N次交换。
证明:每次交换后需要比较的元素减一。设元素数为M
M=1时,比较次数为0。
M=2时,比较次数为1。
M=3时,比较次数为2。
......
M=N时,比较次数为N-1。比较次数一共为0+1+2+...+N-1=(N-1)*N/2~N2/2
交换次数一共N次
- 分析 :运行时间和输入无关
使用选择排序,一个已经有序的数组的排序和随机排列的数组所用的时间一样长。
- 分析 :数据的移动是最少的
每次交换都会改变两个数组元素的值,因此只需要N次交换。这是其他任何算法都不具备的。(大部分都是线性对数或者平方级别)
代码: 略
插入排序
概述:
数组索引左边的元素是已经排好序的元素,右边是待排序的元素。索引指向的元素与左侧相邻元素比较,若比相邻元素大,则索引所指元素排序完成,索引指向下一元素。若比相邻元素晓,则与左侧元素交换,之后继续与相邻左侧元素比较,如此重复至无元素比较或者比相邻元素大。
此过程中,索引一开始所指位置不动。此元素排好序后,索引指向下一元素。如此重复。直到所有元素排好序。
和选择排序不同的是,插入排序所需的时间取决于输入中的元素的初始顺序。

命题:
- B :对于长度为N且不重复的数组,平均情况下,插入排序需要~ N2/4次比较,以及~N2/4次交换。 最坏情况下需要~ N2/2次比较,以及~ N2/2次交换。
最坏情况下的证明:每次交换后需要比较的元素减一。设元素数为M
M=1时,比较次数为0。
M=2时,比较次数为1。
M=3时,比较次数为2。
......
M=N时,比较次数为N-1。
交换同理,所以最坏情况下需要~ N2/2次比较,以及~ N2/2次交换。
性质:对于随机排序的无重复的数组,插入排序和选择排序的运行时间是平方级别的两者之比应该是一个较小的常数。
代码: 略
希尔排序
概述:
对于大规模乱序数组插入排序很慢,因为它只交换相邻的元素。希尔排序则是以间隔为k进行插入排序,然后以m(m<k)为间隔进行插入排序,直至以间隔为1进行插入排序后,数组排序完成。
希尔排序的思想是使数组中任意间隔为h的元素都是有序的。这样的数组称为h有序数组。

h该如何递减至1呢? 要回答这个问题并不简单。算法的性能不仅取决于h还取决于h之间的数学性质,比如公因子等。有很多论文研究了各种不同的定增序列,但都无法证明某个序列是“最好的”。
透彻理解希尔排序的性能至今任然是一项挑战。目前最重要的结论是它的运行时间达不到平方级别。
和选择排序以及插入排序形成对比的是,希尔排序也可用于大型数组,他对任意排序的数组表现也很好。
优点: 代码量小且不需要使用额外的内存空间。对于中等大小的数组予以可接受的运行时间。如果你需要解决一个排序问题而又没有排序函数可用(例如直接接触硬件或是运行于嵌入式系统中的代码),可先用希尔排序,然后再考虑是否值得将它替换为更加复杂的排序算法。
代码: 有人需要再call我写上去吧。
网友评论