zoukankan      html  css  js  c++  java
  • 排序算法之 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 毫秒
         */
    
    }
    

      

  • 相关阅读:
    c# 设计模式 之:装饰模式
    c# 设计模式 之:抽象工厂
    c# 设计模式 之:简单工厂、工厂方法、抽象工厂之小结、区别
    c# 设计模式 之:工厂模式之---工厂模式
    c# 设计模式 之:工厂模式之---简单工厂
    uml
    ASP.NET应用程序生命周期
    C语言可变参数个数
    软件开发过程中的视角
    UML类图与类的关系详解
  • 原文地址:https://www.cnblogs.com/aDiot/p/5232173.html
Copyright © 2011-2022 走看看