版权声明:文章为作者原创,若要转载请获得作者同意。尊重版权,从你我做起! https://blog.csdn.net/qq_37768971/article/details/88777210
一、排序方法:
希尔排序
二、基本原理
(实质是改进版的插入排序,由于间隔排序使得数组基本有序,所以在插入间隔较小时,往往能够提前终止向前寻找插入位置。)
关于希尔排序increment(增量)的取法。
增量increment的取法有各种方案。最初shell提出取increment=n/2向下取整,increment=increment/2向下取整,直到increment=1。但由于直到最后一步,在奇数位置的元素才会与偶数位置的元素进行比较,这样使用这个序列的效率会很低。后来Knuth提出取increment=n/3向下取整+1.还有人提出都取奇数为好,也有人提出increment互质为好。应用不同的序列会使希尔排序算法的性能有很大的差异。
希尔排序应该注意的问题
从上面图解希尔排序的过程可以看到,相等的排序码25在排序前后的顺序发生了颠倒,所以希尔排序是一种不稳定的排序算法。
三、实现代码:
package IMUHERO;
public class ShellSort {
// 我们的算法类不允许产生任何实例
private ShellSort(){}
public static void sort(Comparable[] arr){
int n=arr.length; //数组长度为n;
int h=1; //用来记录步长,步长逐步减小
while(h<n/3)h=h*3+1; //1,4,13...
while(h>=1) { //注意最小步长为1
for (int i = h; i < n; i++) { //从h~n向下遍历元素,逐渐减小步长
Comparable temp=arr[i];
int j=i;
for (;j>=h&&temp.compareTo(arr[j-h])<0;j-=h){
arr[j]=arr[j-h]; //将下标为j-h位置的元素移动到j 的位置
}
arr[j]=temp; //注意此处的arr[j]是在j-=h的基础上进行的,将temp存入合适的位置,完成直接插入排序
}
h=h/3; //逐渐减小步长,直至h=1;
}
}
}
注:关于排序的所有代码都放在我的Github上,有需要的同学可以自行Fork,如果觉得还不错,可以打个☆Star哦~~~