(十四)高级排序—希尔排序

来源:互联网 发布:一元云购源码是什么 编辑:程序博客网 时间:2024/06/09 22:45

一、希尔排序说明:

1.             希尔排序是由于计算机科学家Shell而得名,他在1959年发明了希尔排序算法。希尔排序是基于插入排序,增加了一些新的特性,提高了插入排序的效率。

2.             回顾以往我们的插入排序,会发现,如果一个最小的元素在最右端,进行插入排序时,将他取出放入临时变量,几乎所有的元素都要向右移动一位,效率会非常的低。而希尔排序正好对他进行了改进。

3.             希尔排序的原理是通过加大插入排序中元素之间的间隔,并在这些有间隔的元素中进行插入排序,从而使数据项能够大跨度的移动,当这些数据项排过一趟序之后,在减小间隔进行第二次排序,依次下去。进行排序时,数据项之间的间隔称为增量,用字母h表示。

二、Java语言描述希尔排序算法:

package com.solid.sort;

 

public class ShellSort {

 

    //数组

    private int[] arr;

    //元素个数

    private int nElems;

   

    /**

     * 构造方法

     * @param maxSize

     */

    public ShellSort(int maxSize) {

       arr = new int[maxSize];

       nElems = 0;

    }

   

    /**

     * 插入元素

     * @param key

     */

    public void insert(int key) {

       arr[nElems++] = key;

    }

   

    /**

     * 希尔排序

     */

    public void shellSort() {

       int inner, outer;

       int temp;

      

       //找出h的初始值{1, 4, 13, 40, ......}

       int h = 1;

       while(h <= nElems/3) {

           h = h*3 + 1;

       }

       while(h > 0) {

           for(outer=h; outer<nElems; outer++) {

              temp = arr[outer];

              inner = outer;

             

              while(inner > h-1 && arr[inner-h] >= temp) {

                  arr[inner] = arr[inner-h];

                  inner = inner - h;

              }

               arr[inner] = temp;

           }

           h = (h-1) / 3;

       }

    }

   

    /**

     * 打印数组中的所有元素

     */

    public void display() {

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

           System.out.print(arr[i] + " ");

       }

       System.out.println();

    }

   

    /**

     * 测试main方法

     * @param args

     */

    public static void main(String[] args) {

       ShellSort shell = new ShellSort(10);

       shell.insert(1);

       shell.insert(3);

       shell.insert(5);

       shell.insert(7);

       shell.insert(9);

       shell.insert(2);

       shell.insert(4);

       shell.insert(6);

       shell.insert(8);

       shell.insert(10);

       shell.display();

       shell.shellSort();

       shell.display();

    }

}

原创粉丝点击