基本和插入排序同樣,就是修改了插入排序裏一次須要排序元素的數量.java
1 package algorithm; 2 3 import java.util.Arrays; 4 5 /** 6 * 希爾排序 7 * 8 * @author jyzjyz12@163.com 9 * @since 2017年3月7日 下午3:46:20 10 */ 11 public class ShellSortTest1 { 12 public static void main(String[] args) { 13 int[] arr1 = { 4, 7, 5, 6, 1, 3, 8 }; 14 int[] arr2 = { 7, 6, 5, 4, 3, 2, 1 }; 15 int[] arr3 = { 5, 9, 3, 7, 8, 6, 1, 2, 4 }; 16 int[] arr4 = { 13, 2, 5, 4, 88, 76, 68, 87, 55, 88, 88, 77, 67, 99, 100, 5, 53, 52, 51, 66 }; 17 int[] arr5 = { 49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 1 }; 18 sort(arr1); 19 sort(arr2); 20 sort(arr3); 21 sort(arr4); 22 sort(arr5); 23 System.out.println(Arrays.toString(arr1)); 24 System.out.println(Arrays.toString(arr2)); 25 System.out.println(Arrays.toString(arr3)); 26 System.out.println(Arrays.toString(arr4)); 27 System.out.println(Arrays.toString(arr5)); 28 } 29 30 public static void sort(int[] arr) { 31 // 第一層for把一個大數組拆分紅了N個小數組,再每一個小數組裏進行插入排序,而後修改分組規則減少小數組長度,再進行拆分和插入排序,直到拆分的小數組長度爲2截止(相鄰2個元素進行插入排序) 32 for (int size = arr.length / 2; size >= 1; size = size / 2) { 33 // 下面這個for和插入排序的邏輯徹底同樣 34 for (int i = size; i < arr.length; i++) { 35 // 不用whille用下面註釋掉的for循環也能夠.我用while是由於以前的插入排序用了while.這裏保持一致好記一點. 36 // int value = arr[i]; 37 // int j = i - size; 38 // for (; j >= 0; j = j - size) { 39 // if (value >= arr[j]) { 40 // break; 41 // } else { 42 // arr[j + size] = arr[j]; 43 // } 44 // } 45 // arr[j + size] = value; 46 int value = arr[i]; 47 int j = i; 48 while (j - size >= 0 && value < arr[j - size]) { 49 arr[j] = arr[j - size]; 50 j = j - size; 51 } 52 arr[j] = value; 53 } 54 } 55 } 56 }