希尔排序-java语言版

145 阅读1分钟

希尔排序是插入排序的一种,又称“缩小增量排序”,是插入排序算法的一种更高效的改进版本。

排序原理:
    1、选定一个增长量h,按照增长量h作为数据分组的依据,对数据进行分组。
    2、对分好组的每一组数据完成插入排序。
    3、减小增长量,最小减为1,重复第二步操作。

-- 原理图:

希尔排序原理图.png

-- API设计:

希尔排序API设计.png

-- 代码:

/**
 * 希尔排序
 */
public class Shell {
    /**
     * 排序接口
     * @param a
     */
    public static void sort(Comparable[] a) {
        // 确定增长量
        int N = a.length;
        int h = 1;
        while(h < N) {
            h = 2*h+1;
        }

        // 当增长量小于1,排序结束
        while(h >= 1) {
            // 按增长量进行插入排序
            for(int i = h;i < N;i++) {  // 遍历未排序元素
                for(int j = i;j >= h;j -= h) {  // 遍历已排序元素
                    if(greater(a[j-h],a[j])) {  // 如果已排序的元素大于未排序的元素,交换位置
                        exch(a,j-h,j);
                    }else {
                        // 找到一个元素小于等于未排序元素跳出循环
                        break;
                    }
                }
            }
            h /= 2;     // 缩小增长量
        }
    }

    /**
     * 元素v是否大于元素w
     * @param v
     * @param w
     * @return
     */
    private static boolean greater(Comparable v,Comparable w) {
        return v.compareTo(w) > 0;
    }

    /**
     * 交换i和j位置的元素
     * @param a
     * @param i
     * @param j
     */
    private static void exch(Comparable[] a,int i,int j) {
        Comparable temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
}

-- 测试代码:

public class ShellTest {
    public static void main(String[] args) {
        Integer[] a = {9,1,2,5,7,4,8,6,3,5} ;
        Shell.sort(a);
        System.out.println(Arrays.toString(a));
    }
}

-- 运行效果图:

希尔排序运行效果图.png

@ 以上内容属于个人笔记