shell排序,是插入排序的改进算法,采用分组插入。
直接上例子吧,不懂插入排序的见我的博文插入排序。
如例子
9 1 5 8 3 7 2 4 5
取梯度:1, 5, 19, 41, 109......
因为 number of element is 9< 19.所以梯度取5和1。
第一回合:i=0,取9和7(i+梯度5得到元素7),
9,7 插入排序后得7,9
所以原数组变为:
7 1 5 8 3 9 2 4 5
第二回合:i=1,取1和2,
1,2插入排序后得1,2
所以原数组变为:
7 1 5 8 3 9 2 4 5
依次类推最后得:
7 1 4 5 3 9 2 5 8
接下来梯度取1,此时就是插入排序,经过之前的调整,小元素相对于之前往前移动了,而大元素往后移动了,这就是shell排序魅力之所在。
代码类似插入的,很简单,就不写了,给个别人的链接:shell排序 复杂度为O(N*(lgN)^2);因为分组的结果,导致相同的数可能顺序打乱,所以shell排序为不稳定的排序。
选择排序:包括堆排序和直接(简单)选择排序。
堆排序见 我的博客 。
直接选择排序很简单。
每次选择一个最小的数,放在左边。
具体过程如下:
5 3 2 4 8
第一回合:寻找到最小元素 2,2和5交换
2 3 5 4 8
第二回合:在 3 5 4 8里找到最小值 3
数组变为
2 3 5 4 8
依次类推,最后成为:
2 3 4 5 8
简单选择排序的复杂度为:O(N*N)。稳定的排序。