希尔排序

希尔排序

一、概念及其介绍

希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。

希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名。

它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。

1024555-20161128110416068-1421707828

//缩小增量排序
//是插入排序的优化---交换法
public class ShellSort {
    public static void main(String[] args) {
        int arr[] = {8,9,1,7,2,3,5,4,6,0}; //10个数
        shellSort(arr);
    }
    public static void shellSort(int arr[]){
        for (int d = arr.length / 2;d>0;d /= 2){ //d:增量  5 2 1
            for (int i = d; i < arr.length; i++){ //    i = 6
                //i:代表即将插入的元素角标,作为每一组比较数据的最后一个元素角标
                //j:代表与i同一组的数组元素角标
                for (int j = i-d; j>=0; j-=d){ //在此处-d 为了避免下面数组角标越界
                    if (arr[j] > arr[j + d]) {// j+d 代表即将插入的元素所在的角标
                        //符合条件,插入元素(交换位置)
                        int temp = arr[j];
                        arr[j] = arr[j + d];
                        arr[j + d] = temp;
                    }
                }
            }
            System.out.println("第"+d+"轮插入");
            System.out.println(Arrays.toString(arr));
        }
     }
}


二 优化

  • 一种优化方法就是使用更高性能的递增序列
  • 因为是基于插入排序,所以希尔排序的优化可以借鉴简单插入排序的优化方法处理
//希尔排序的优化---移位法
public class ShellSort优化 {
    public static void main(String[] args) {
        int arr[] = {8,9,1,7,2,3,5,4,6,0}; //10个数
        shellSort(arr);
    }

    public static void shellSort(int arr[]) {
        for (int d = arr.length / 2; d > 0; d /= 2) { //d:增量  5 2 1
            for (int i = d; i < arr.length; i++) { //    i = 6
                int j = i;
                int temp = arr[j];
                if (arr[j] < arr[j - d]) {
                    while (j - d >= 0 && temp < arr[j - d]) {
                        arr[j] = arr[j - d];
                        j -= d;
                    }
                    arr[j] = temp;
                }
            }
            System.out.println("第" + d + "轮插入");
            System.out.println(Arrays.toString(arr));
        }
    }
}
posted @ 2022-02-17 13:43  被动  阅读(51)  评论(0)    收藏  举报