遵义网站建设网站长春关键词优化平台
1、算法思想:希尔算法又名缩小增量排序,本质是插入排序,只不过是将待排序的序列按某种规则分成几个子序列,分别对几个子序列进行直接插入排序。这个规则就是增量,增量选取很重要,增量一般选序列长度一半,然后逐半递减,直到最后一个增量为1,为1相当于直接插入排序。
2、算法过程
举个栗子(第一趟的排序过程)
原始序列:49、38、65、97、76、13、27、49,55、04
1)序列长度为10,所以第一次分割增量len=5,进行分割序列,得到5个子序列
子序列1:49 13
子序列2: 38 27
子序列3: 65 49
子序列4: 97 55
子序列5: 76 04
2)分别对这5个序列进行直接插入排序
子序列1:13 49
子序列2: 27 38
子序列3: 49 65
子序列4: 55 97
子序列5: 04 76
结果: 13、27、49,55、04、49、38、65、97、76
3)增量缩减一半取len=2,分割的到2个子序列
子序列1:13 49 04 38 97
子序列2: 27 55 49 65 76
4)分别对这2个序列进行直接插入排序
子序列1:04 13 38 49 97
子序列2: 27 49 55 65 76
结果: 04 、27、13,49、38、55、49、65、97、76
5)最后增量取len=1,进行一次直接插入排序,得到完整的希尔排序
结果:04、13、27、38、49、49、55、65、76、97
public class ShellSort {public static void main(String[] args) {int[] arr = {49, 38, 65, 97, 76, 13, 27, 49, 55,04};shellSort(arr,arr.length);}public static void shellSort(int[] arr,int len) {if (arr == null || arr.length <= 1) {return;}while (len>=1){//进行插入排序for(int i = len; i < arr.length; i++) {for (int j = i - len; j >= 0 && arr[j+len] < arr[j];j -= len) {int temp = arr[j+len];arr[j+len] = arr[j];arr[j] = temp;}}//设置新的增量len=len/2;System.out.println(Arrays.toString(arr));}}
}