排序算法(四):希尔排序

版权声明:文章为作者原创,若要转载请获得作者同意。尊重版权,从你我做起! 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哦~~~

猜你喜欢

转载自blog.csdn.net/qq_37768971/article/details/88777210