排序算法之 Java希尔排序算法

package net.qh.test.sort;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

/**
 * Created by Administrator on 2016/03/01.
 */
public class Shell {

    public int[] sort(int[] arr){
        if ( arr == null || arr.length <= 1 ){
            return arr;
        }
        int length = arr.length;

        /**
            h排序:每隔h个记录就选择一个记录以便反复再分为交替记录的方式。
            根据所选h的序列来描述希尔排序。
            这种产生h的计算方法,会选出一个变现良好的h值序列。
            这个h序列很重要,最外层的循环次数。
         */
        int h;
        for(h = 1; h < length / 9; h = 3 * h + 1);

        for(; h > 0; h = h / 3){
            int i = h;
            for( ; i < length; i++ ){
                int temp = arr[i];
                int k = i - h;
                while (k >= 0) {
                    if( arr[k] > temp ){
                        arr[k + h] = arr[k];
                    }else{
                        break;
                    }
                    arr[k] = temp;
                    k = k -h;
                }
            }
        }

        return arr;
    }


    public static void main(String[] args){

        List<Integer> intList = new ArrayList<Integer>();
        for(int i = 0; i < 100000; i++){
            intList.add(i);
        }
        int[] arr = new int[intList.size()];
        for(int j = 0; j < arr.length; j++){
            arr[j] = intList.get(j);
        }
        for(int temp : arr){
            System.out.print(temp + ", ");
        }
        System.out.println("");
        long start = Calendar.getInstance().getTimeInMillis();
        arr = new Shell().sort(arr);
        long end = Calendar.getInstance().getTimeInMillis();
        System.out.println("所需毫秒:" + (end - start));
        for(int temp : arr){
            System.out.print(temp + ", ");
        }
    }

    /**
        1. 该排序算法是希尔排序算法。
        2. 来由:
                他是插入排序算法的一个灵巧变体。
                插入排序之所以慢,是因为 它一次只把一个项目称为有序的记录。如果记录离目标位置很远,我们需要多次办交换才能到达。
                我们可以考虑,在排序的早期阶段,允许记录跳转较大的距离。
        3. 排序思想: 将记录分为几个交替的组,对每个组进行插入排序。
        4. h序列很重要。
        5. 希尔算法是一个比较复杂的一个排序算法,并且依赖于h序列。
        6. 希尔排序的阶: O(n^1.25),不是稳定的排序算法, 比冒泡和简单的插入排序要快很多。
        7. 排序对象的有序性,不敏感。可以使用任何情况下的排序,很优秀。
        8. 实战测试:4核CPU和8G内存下,对100000个整型元素的数组排序, 逆序需要 8 毫秒, 有序需要:5 毫秒
     */

}

  

posted @ 2016-03-01 19:09  A_Diot  阅读(192)  评论(0编辑  收藏  举报