基本介绍
希尔排序是希尔在1959年提出的一种排序算法,也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也成为缩小增量排序
基本思想
package com.gcy.sort;
import java.util.Arrays;
import org.omg.CORBA.PUBLIC_MEMBER;
/**
 * 希尔排序
 * @author Administrator
 *
 */
public class ShellSort {
	public static void main(String[] args) {
		int [] arr= {8,9,1,7,2,3,5,4,6,0};
		System.out.println("排序前的数组"+Arrays.toString(arr));
		//shellSort(arr);
		shellSort2(arr);
		System.out.println("排序后的数组"+Arrays.toString(arr));
	}
	/**
	 * 希尔排序交换法
	 * @param arr
	 */
	public static void shellSort(int [] arr) { 
		int temp=0;
		for(int gap=arr.length/2;gap>0;gap/=2) {
			for(int i=gap;i<arr.length;i++) {
				for(int j=i-gap;j>=0;j-=gap) {
					//如果当前元素大于加上步长后的元素,就需要交换
					if(arr[j]>arr[j+gap]) {
						temp=arr[j];
						arr[j]=arr[j+gap];
						arr[j+gap]=temp; 
					}
				}
			}
		}
	}
	/**
	 * 对交换式的希尔排序进行优化————》使用移位法
	 * @param arr
	 */
	public static void shellSort2(int [] arr) {
		for(int gap=arr.length/2;gap>0;gap/=2) {
			//从第gap个元素,逐个对其所在的组进行直接插入排序
			for(int i=gap;i<arr.length;i++) {
				int j=i;
				int temp=arr[j];
				if(arr[j]<arr[j-gap]) {
					while(j-gap>=0 && temp<arr[j-gap]) {
						//移动
						arr[j]=arr[j-gap];
						j-=gap;
					}
					//当while循环退出后,就给temp找到了插入的位置
					arr[j]=temp;
					
				}
			}
		}
	}
		
		
		
		
		
		
		
		
		
		
//具体的分析
		/*int temp=0;
		//希尔排序第一轮排序
		//因为第一轮排序,是将10个元素分成了5组
		for(int i=5;i<arr.length;i++) {
			for(int j=i-5;j>=0;j-=5) {
				//如果当前元素大于加上步长后的元素,就需要交换
				if(arr[j]>arr[j+5]) {
					temp=arr[j];
					arr[j]=arr[j+5];
					arr[j+5]=temp; 
				}
			}
		}
		System.out.println("希尔排序第一轮排序后"+Arrays.toString(arr));*/
		
	
}
结果:

原文:https://www.cnblogs.com/juddy/p/13768831.html