希尔排序

public class ShellSort {

	public static void main(String[] args) {
		int[] arr = new int[] {9,8,7,6,5,4,3,2,1,0};
		shellSort(arr);
		System.out.println(Arrays.toString(arr));
	}
	
	/**
	 * 1.分组有什么用?
	 * 	可以提前调整数据的位置,减少后面移动的次数。
	 * 2.为什么缩小增量进行分组排序,最后数组就有序了?
	 * 	不管初始增量为多少,最后都会变成1,进行一次完整的插入排序,所以最后整个数组有序。
	 */
	public static void shellSort(int[] arr) {
		for(int gap = arr.length / 2; gap > 0; gap /= 2) {
			for(int i = 1; i < arr.length; i++) {
				//当i < gap时,没有交换的对象
				if(i >= gap) {
					int insertVal = arr[i];
					int insertIndex = i - gap;
					while(insertIndex >= 0 && arr[insertIndex] > insertVal) {
						arr[insertIndex+gap] = arr[insertIndex];//后移gap个单位
						insertIndex -= gap;
					}
					arr[insertIndex+gap] = insertVal;
				}
			}
		}
	}
	
}

  

posted @ 2020-01-08 17:10  地中有山  阅读(102)  评论(0编辑  收藏  举报