1:     public static void ShellSort(Elem[] A) 
     2:     {
     3: 	int n = A.length;
     4: 	int increment, offset;
     5: 	for (increment = n/2; increment >  0; increment = increment / 2)
     6: 	    for (offset=0; offset < increment; offset++) 
     7: 		InsertionSort(A, offset, increment);
     8:     }
     9: 
    10:     public static void InsertionSort(Elem[] A,int offset,int increment)
    11:     {
    12: 	int i,j;
    13: 	int n = A.length;
    14: 	for (i=offset + increment; i<n; i=i+increment) 
    15:         {
    16: 	    Elem insert_elem = A[i];
    17: 	    for(j=i-increment; j>=0 && A[j].key() > insert_elem.key(); j = j - increment) 
    18: 	    {
    19: 		A[j+increment] = A[j] ;
    20: 	    }
    21: 	    A[j+increment] = insert_elem;
    22: 	}
    23:     }
    24: