Java希尔排序


Java希尔排序

/**
 * 希尔排序
 *
 * @author yl
 */
public class ShellSort {

    public static void main(String[] args) {
        int[] array = {7, 6, 9, 3, 1, 5, 2, 4};
        System.out.println(Arrays.toString(shellSort(array)));
    }

    /**
     * 希尔排序算法
     * 希尔排序是插入排序的一种,又称缩小增量排序,它是针对直接插入排序算法的改进,因 DL.Shell 于 1959 年提出而得名。
     * 希尔排序是非稳定排序算法,它通过比较相距指定步长的元素来进行排序,每趟比较的步长随着算法的进行而减小,直到步长等于1的最后一趟排序结束。
     * 希尔排序是基于插入排序的以下两点性质而提出改进方法的:
     * 1、插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
     * 2、但插入排序一般来说是低效的,因为插入排序每次只能将数据移动1
     * 希尔排序是先将整个待排序的序列分组排序(两两一组),待整个序列中基本有序时,再对全体记录进行依次直接插入排序。
     *
     * @param array
     * @return
     */
    public static int[] shellSort(int[] array) {
        // 步长可以自己定义,一般指定为数组长度的一半
        for (int i = array.length / 2; i > 0; i = i / 2) {
            // 从下标等于步长的位置开始排序
            for (int j = i; j < array.length; j++) {
                // 如果后面的数比前面的数小,则交换位置
                while (j - i >= 0 && array[j] < array[j - i]) {
                    int temp = array[j];
                    array[j] = array[j - i];
                    array[j - i] = temp;
                    // 注意,交换完位置后,还要比较交换完位置的array[j]是否比相距指定步长的array[j-i]小,如果是,则继续交换位置。
                    // 基于这个原因,不能使用if来判断,否则只能交换一次位置
                    j = j - i;
                }
            }
        }
        return array;
    }


}

相关