希尔排序

希尔排序

希尔排序其实就是对直接插入排序的优化。希尔排序的时间复杂度为o(N*logN),他较为不稳定;比较适合对n比较小的数组进行排序。

例子:

原始数组[1,3,7,6,8,0,9,2,4,5] 首先根据(数组长度/2)得到增量为5

所以分为五组 [1,0],[3,9],[7,2],[6,4],[8,5]  对他们进行直接插入排序

第一次排序后得[0,3,2,4,5,1,9,7,6,8] ,这时候增量为5/2=2;

 

所以将分为两组[0,2,5,9,6],[3,4,1,7,8] 分别对他们进行直接插入排序

得[ 0,1,2,3,5,4,6,7,9,8] 这是增量为2/2=1;

 

所以最后直接对[ 0,1,2,3,5,4,6,7,9,8]行直接插入排序;

结果0,1,2,3,4,5,6,7,8,9

 1 package sort;
 2 
 3 import java.util.Scanner;
 4 
 5 public class shellSort {
 6 
 7     public static void main(String[] args) {
 8         
 9         //键盘输入
10         Scanner scan = new Scanner(System.in);
11         String str = scan.next();
12         System.out.println(str);
13         String snum[] = str.split(","); //以,分格字符串
14         System.out.println(snum.length);
15         double num[] = new double[snum.length];
16         for(int i=0;i<snum.length;i++) num[i] = Double.valueOf(snum[i]);
17         
18         //排序
19         
20         
21         for(int len =num.length/2;len>0;len/=2 ) {    //len为增量
22             for(int i=len;i<num.length;i++) {
23                 int j=i;
24                 while(j-len>=0&&num[j]<num[j-len]) {
25                     num[j] = num[j]+num[j-len];
26                     num[j-len]=num[j]-num[j-len];
27                     num[j] = num[j] - num[j-len];
28                     j-=len;
29                 }
30                 
31             }
32             for(int i=0;i<num.length;i++) System.out.print(num[i]+"  ");
33             System.out.println();
34         }
35         
36         /*for(int len = num.length/2;len>0;len/=2) {
37             for(int i=0;i+len<num.length;i++) {
38                 int j =len;
39                 while(i+j<num.length) {
40                     if(num[i]>num[i+j]) {
41                     num[i] = num[i]+num[i+j];
42                     num[i+j]=num[i]-num[i+j];
43                     num[i] = num[i] - num[i+j];
44                     }
45                     j+=len;
46                 }
47             }
48             for(int i=0;i<num.length;i++) System.out.print(num[i]+"  ");
49             System.out.println();
50         }*/
51         
52         for(int i=0;i<num.length;i++) System.out.print(num[i]+"  ");
53         
54     }
55     
56     
57 
58 }

 

 

 

 

 

 

posted @ 2018-08-20 13:58  胡叔叔  阅读(180)  评论(0编辑  收藏  举报