1 package Insert.sort; 2 3 import java.util.Scanner; 4 5 /*又叫缩小增量排序,本质是插入排序,将待排的序列增量分成几个子序列,分别对每个子序列进行直接插入排序 6 * 增量为5时,取1、6、11、16...为一组,2、7、12、17...为一组等,分别对这些组进行直接插入排序,就是一趟希尔排序 7 * 再以增量为3分割,构成组,分别对这些组进行直接插入排序,就是第二趟希尔排序 8 * 增量为1分割,就是将整个序列进行一趟直接插入排序...第三趟 9 * 希尔排序的思想:直接插入排序适合基本有序的情况,希尔的每趟排序都会使整个序列变得更加有序,等整个序列基本有序了, 10 * 再来一趟直接插入排序,这样会使排序效率更高 11 * 希尔排序是不稳定排序 12 * 时间复杂度O(nlog2(n)) ..2是低 13 * 空间复杂度O(1) 14 * 注:增量序列最后一个值为1,增量序列中的值没有除1之外的公因子*/ 15 public class shell { 16 17 public static void main(String args[]){ 18 Scanner cin = new Scanner(System.in); 19 String str = cin.nextLine(); 20 String[] st = str.split(" "); 21 int[] c = new int[st.length] ; 22 for(int i=0;i<st.length;i++){ 23 c[i]=Integer.parseInt(st[i]); 24 } 25 shellSort(c); 26 for(int i=0;i<c.length;i++){ 27 System.out.print(c[i]); 28 System.out.print(" "); 29 } 30 cin.close(); 31 } 32 public static void shellSort(int R[]){ 33 int k = R.length/2;//分组的增量 34 int temp =0 ; 35 int x = 0; 36 while(k>=1){ 37 for(int i=0;i<k;i++){//每组的起始位置 38 for(int j=i+k;j<R.length;j+=k){//前后记录位置的增量是k,而不是1 39 x=j-k; 40 temp=R[j]; 41 while(x>=i&&temp<R[x]){ 42 R[x+k]=R[x];//移动的增量是k不是1 43 x-=k; 44 } 45 R[x+k]=temp; 46 } 47 } 48 k=k/2; 49 } 50 } 51 }