希尔排序的实现

在介绍希尔排序之前需要先简单介绍一下简单插入排序,因为希尔排序可以算作是插入排序的 变种,插入排序的原理是从序列的第二个元素开始,和前面的元素比较,找到比它小的元素, 插在它后面(升序排列),相当于插在比它大的元素前面,然后循环至序列最后一个元素, 每次要比较的元素前面都是有序的(所以简单插入排序是稳定的),而希尔排序是先将序列 分成多个子序列对子序列进行插入排序,最后对整个序列进行一次插入排序(不稳定排序)。

插入排序:

    待排序  5 2 3 1 6
    第一趟  2 5 3 1 6
    第二趟  2 3 5 1 6
    第三趟  1 2 3 5 6
    第四趟  1 2 3 5 6

希尔排序:

JAVA实现代码:

import java.util.Arrays;

/**
 * Description: 希尔排序
 * Author: zhangliangfu
 * Create on: 2019-08-21 9:50
 */
public class ShellSort {

    /**
     * 插入排序
     * @param a
     */
    public static void insertSort(int a[]){
        for (int i = 1; i < a.length; i++) {
            int j;
            if (a[i]<a[i-1]){
                int temp = a[i]; //设置哨兵
                //集体往后移
                for (j = i-1; j>=0&&a[j]>temp; j--) {
                    a[j+1] = a[j];
                }
                a[j+1] = temp;
            }
        }
    }

    /**
     * 希尔排序
     * @param a
     */
    public static void shellSort(int a[]){
        int len = a.length;
        for (int distance = len/2; distance >= 1; distance/=2) {
            // 共有distance组
            for (int i = 1; i<=distance; i++){
                //分组进行插入排序
                for (int j = distance; j < len/distance; j+=distance) {
                    int k;
                    if (a[j]<a[j-distance]){
                        int temp = a[j]; //设置哨兵
                        for(k = j-distance; k>=0&&a[k]>temp; k-=distance){
                            a[k+distance] = a[k];
                        }
                        a[k+distance] = temp;
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        int a[] = {9, 6, 3, 7, 5, 1, 12, 14, 11};
//        insertSort(a);
        shellSort(a);
        System.out.println(Arrays.toString(a));

    }
}

Table of Contents