九大排序算法之希尔排序(原理及实现)

1、算法思想:希尔算法又名缩小增量排序,本质是插入排序,只不过是将待排序的序列按某种规则分成几个子序列,分别对几个子序列进行直接插入排序。这个规则就是增量,增量选取很重要,增量一般选序列长度一半,然后逐半递减,直到最后一个增量为1,为1相当于直接插入排序。

2、算法过程

举个栗子(第一趟的排序过程)

原始序列:49、38、65、97、76、13、27、49,55、04

1)序列长度为10,所以第一次分割增量len=5,进行分割序列,得到5个子序列

子序列1:49                                     13

子序列2:        38                                     27

子序列3:                  65                                  49

子序列4:                          97                                 55

子序列5:                                 76                                  04

2)分别对这5个序列进行直接插入排序

子序列1:13                                    49

子序列2:        27                                    38

子序列3:                  49                                65

子序列4:                          55                                97

子序列5:                                 04                                 76

结果:     13、27、49,55、04、49、38、65、97、76

3)增量缩减一半取len=2,分割的到2个子序列

子序列1:13          49            04           38            97

子序列2:        27          55            49           65            76

4)分别对这2个序列进行直接插入排序

子序列1:04         13            38            49            97

子序列2:        27          49           55            65            76

结果:   04 、27、13,49、38、55、49、65、97、76

5)最后增量取len=1,进行一次直接插入排序,得到完整的希尔排序

结果:04、13、27、38、49、49、55、65、76、97

public class ShellSort {

    public static void main(String[] args) {
        int[] arr = {49, 38, 65, 97, 76, 13, 27, 49, 55,04};
        shellSort(arr,arr.length);
    }
    public static void shellSort(int[] arr,int len) {
        if (arr == null || arr.length <= 1) {
            return;
        }
        while (len>=1){
            //进行插入排序
            for(int i = len; i < arr.length; i++) {
                for (int j = i - len; j >= 0 && arr[j+len] < arr[j];j -= len) {
                    int temp = arr[j+len];
                    arr[j+len] = arr[j];
                    arr[j] = temp;
                }
            }
            //设置新的增量
            len=len/2;
            System.out.println(Arrays.toString(arr));
        }
    }
}

猜你喜欢

转载自blog.csdn.net/changhangshi/article/details/82744427