Source of ShellSort.java



  3: import java.util.Scanner;

  5: /**
  6:  *
  7:  * @author Mark Young (A00000000)
  8:  */
  9: public class ShellSort {

 11:     public static final Scanner KBD = Common.KBD;
 12:     private static final int HOW_MANY = 10;
 13:     private static final int MAX = 1000;
 14:     private static int traceLevel = 0;

 16:     public static void main(String[] args) {
 17:         System.out.println("\n\n"
 18:                 + "Shell Sort\n"
 19:                 + "==========\n");

 21:         setTraceLevel();

 23:         // create an array of random integers
 24:         int[] numbers = Common.randomNumbers(HOW_MANY, MAX / 10, MAX);
 25:         Common.printArray(numbers);
 26:         Common.pause();

 28:         // sort it
 29:         shellSort(numbers);
 30:         
 31:         // show it sorted
 32:         System.out.println("Array now sorted");
 33:         Common.printArray(numbers);
 34:         Common.pause();
 35:     }

 37:     /**
 38:      * Prompt for and read a level of tracing to do.
 39:      */
 40:     public static void setTraceLevel() {
 41:         String traceMenu = "Enter a trace level: \n"
 42:                 + "  0 - no tracing\n"
 43:                 + "  1 - outer loop only (n-sorted)\n"
 44:                 + "  2 - middle loop, too (inserted)\n"
 45:                 + "  3 - innermost loop (inserting)\n\n"
 46:                 + "Trace level: ";

 48:         System.out.print(traceMenu);
 49:         traceLevel = KBD.nextInt();
 50:         KBD.nextLine();
 51:         while (traceLevel < 0 || 3 < traceLevel) {
 52:             System.out.print(traceMenu);
 53:             traceLevel = KBD.nextInt();
 54:             KBD.nextLine();
 55:         }
 56:     }

 58:     /**
 59:      * Perform insertion sort on the given array.
 60:      *
 61:      * @param arr the array to sort
 62:      */
 63:     public static void shellSort(int[] arr) {
 64:         int gap = arr.length / 2;
 65:         while (gap >= 1) {
 66:             if (gap % 2 == 0) {
 67:                 ++gap;
 68:             }
 69:             if (traceLevel > 1) {
 70:                 System.out.println("..." + gap + "-sorting...");
 71:                 Common.printArray(arr);
 72:                 Common.pause();
 73:             }
 74:             for (int i = 0; i < arr.length - gap; ++i) {
 75:                 int p = i + gap;
 76:                 int temp = arr[p];
 77:                 if (traceLevel > 2) {
 78:                     System.out.println("...inserting " + temp + "...");
 79:                     Common.printOffset(arr, gap, i % gap);
 80:                     Common.pause();
 81:                 }
 82:                 while (p >= gap && arr[p - gap] > temp) {
 83:                     arr[p] = arr[p - gap];
 84:                     p -= gap;
 85:                     if (traceLevel > 2) {
 86:                         System.out.println("...inserting " + temp + "...");
 87:                         System.out.println("...copy up " + arr[p] + "...");
 88:                         Common.printOffset(arr, gap, i % gap);
 89:                         Common.pause();
 90:                     }
 91:                 }
 92:                 arr[p] = temp;
 93:                 if (traceLevel > 1) {
 94:                     System.out.println("one more inserted: ");
 95:                     Common.printOffset(arr, gap, i % gap);
 96:                     Common.pause();
 97:                 }
 98:             }
 99:             if (traceLevel > 0) {
100:                 System.out.println("now " + gap + "-sorted");
101:                 for (int rem = 0; rem < gap; ++rem) {
102:                     System.out.println("...offset " + rem);
103:                     Common.printOffset(arr, gap, rem);
104:                 }
105:                 Common.pause();
106:             }
107:             gap /= 2;
108:         }
109:     }

111: }