希尔排序法,是D.L.Shell在1959年7月发明的一种排序法.

原理上,有点像插入排序法,但它可以减少数据搬移的次数.排序的原则是将数据分成特定间隔的几个小区块,以插入排序法拍完区块内的数据,再渐渐减少间隔的距离.

算法分析:

  • 任何情况下,时间复杂度均为O(n3/2).
  • 希尔排序法和插入排序法一样,都是稳定排序
  • 只需要一个额外的空间,所以空间复杂度最佳
  • 此排序法适用于数据大部分都已经排序完成的情况
import java.util.Random;

/**
 * 算法大神之路----排序(希尔排序法)
 */
public class Study04 {

    public static void main(String[] args) {

        //新建一个数组
        int[] arr = new int[20];
        Random r = new Random();
        for (int i = 0; i < arr.length; i++) {
        //使用随机数给数组赋值
            arr[i] = r.nextInt(50);
        }
        System.out.print("原数组为:");
        paint(arr);
        System.out.println("-----排序-----");

        int i;//扫描次数
        int j;//以j来定为比较元素
        int k=1;
        int tmp;//用k来暂存数据
        int jmp;//jmp用来设定间隔的位移量
        jmp=arr.length/2;
        while (jmp!=0){

            for (i = jmp; i <arr.length ; i++) {

                tmp=arr[i];
                j=i-jmp;
                while (j>=0&&tmp<arr[j]){
                    arr[j+jmp]=arr[j];
                    j=j-jmp;
                }
                arr[jmp+j]=tmp;
            }
            System.out.print("第"+(k++)+"次排序");
            paint(arr);
            jmp=jmp/2;
        }

        System.out.print("排序结束后,数组为:");
        paint(arr);
    }

    //遍历打印出数组的数据
    public static void paint(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+"\t");
        }
        System.out.println();
    }

}

控制台输出语句:

image

posted on 2017-08-16 01:03  博客王大锤  阅读(439)  评论(0编辑  收藏  举报