zoukankan      html  css  js  c++  java
  • 排序算法-希尔排序

    package Sort;
    
    import org.junit.Test;
    
    import Sort.utils.Swap;
    
    /*
     * 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,
     * 它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。
     * 
     * 简单插入排序很循规蹈矩,不管数组分布是怎么样的,依然一步一步的对元素进行比较,移动,插入,
     * 比如[5,4,3,2,1,0]这种倒序序列,数组末端的0要回到首位置很是费劲,比较和移动元素均需n-1次。
     * 而希尔排序在数组中采用跳跃式分组的策略,通过某个增量将数组元素划分为若干组,然后分组进行插
     * 入排序,随后逐步缩小增量,继续按组进行插入排序操作,直至增量为1。希尔排序通过这种策略使得整
     * 个数组在初始阶段达到从宏观上看基本有序,小的基本在前,大的基本在后。然后缩小增量,到增量为1
     * 时,其实多数情况下只需微调即可,不会涉及过多的数据移动。  
     * 
     * 我们来看下希尔排序的基本步骤,在此我们选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,
     * 这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2...1},称为增量序列。希尔排序的增量序列的
     * 选择与证明是个数学难题,我们选择的这个增量序列是比较常用的,也是希尔建议的增量,称为希尔增量,
     * 但其实这个增量序列不是最优的。此处我们做示例使用希尔增量。
     */
    public class ShellSort {
    	public static <T extends Comparable<T>> void shellSort1(T[] arr) {
    		// 增量gap,并逐步缩小增量
    		for (int gap = arr.length / 2; gap > 0; gap /= 2) {
    			// 从第gap个元素,逐个对其所在组进行直接插入排序操作
    			for (int i = gap; i < arr.length; i++) {
    				int j = i;
    				while (j - gap >= 0 && arr[j].compareTo(arr[j - gap]) < 0) {
    					// 插入排序采用交换法
    					Swap.swap(arr, j, j - gap);
    					j -= gap;
    				}
    			}
    		}
    	}
    
    	public static <T extends Comparable<T>> void shellSort2(T[] arr) {
    		// 增量gap,并逐步缩小增量
    		for (int gap = arr.length / 2; gap > 0; gap /= 2) {
    			// 从第gap个元素,逐个对其所在组进行直接插入排序操作
    			for (int i = gap; i < arr.length; i++) {
    				int j = i;
    				T temp = arr[j];
    				if (arr[j].compareTo(arr[j - gap]) < 0) {
    					while (j - gap >= 0 && temp.compareTo(arr[j - gap]) < 0) {
    						// 移动法
    						arr[j] = arr[j - gap];
    						j -= gap;
    					}
    					arr[j] = temp;
    				}
    			}
    		}
    	}
    
    	@Test
    	public void testShellSort() {
    		 Integer[] arr = { 34, 8, 64, 51, 32, 21 };
    //		String[] arr = { "abc", "cccc", "bbb" };
    		shellSort2(arr);
    		for (int i : arr) {
    			System.out.print(i + " ");
    		}
    	}
    }
    

  • 相关阅读:
    Win10 UWP Tile Generator
    Win10 BackgroundTask
    UWP Tiles
    UWP Ad
    Win10 build package error collections
    Win10 八步打通 Nuget 发布打包
    Win10 UI入门 pivot multiable DataTemplate
    Win10 UI入门 导航滑动条 求UWP工作
    UWP Control Toolkit Collections 求UWP工作
    Win10 UI入门 SliderRectangle
  • 原文地址:https://www.cnblogs.com/wei1/p/9582108.html
Copyright © 2011-2022 走看看