希尔排序
希尔排序
希尔排序其实就是对直接插入排序的优化。希尔排序的时间复杂度为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 }