문제는 다음과 같습니다.
[#M_ more.. | less.. |
3) [20점] Quick Sort는 Pivot을 선택하는 방법에 따라 여러 가지 종류가 있다. 즉, 알고리즘의 다른 부분은 같고 Pivot을 정하는 방법만 다른 여러 개의 알고리즘이 있다. Template Method Pattern을 사용하여 hook을 사용하면 간단하게 여러 가지 알고리즘을 구현 할 수 있다. 아래 3개의 다른 알고리즘들을 hook을 이용하여 구현하라._M#]

Test 클래스를 먼저 작성했습니다.
[#M_ more.. | less.. |
public abstract class AbstractSortingTest {

   QuickSorting quickSorting;

   @Before
   public void setup() {
       quickSorting = createQuickSorting();
   }

   abstract public QuickSorting createQuickSorting();

   @Test
   public final void sorting() {
       int[] values = { 2, 5, 6, 3, 1, 8, 7, 9, 4 };
       quickSorting.setValues(values);
       // for (int a : values)
       // System.out.print(a);
       // System.out.println();
       assertEquals(values, quickSorting.getValues());
       quickSorting.sort(values);
       // for (int a : values)
       // System.out.print(a);
       int[] sorterdValues = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
       assertEquals(sorterdValues, quickSorting.getValues());
   }
}_M#]

그리고 탬플릿 역활을 하는 QuickSorting 메소드를 작성했습니다.
[#M_ more.. | less.. |
public abstract class QuickSorting {

   private int[] values;

   public int[] getValues() {
       return values;
   }

   abstract public int getPivot(int[] a, int first, int last);

   public void sort(int a[], int _first, int _last) {
      ...
       int pivot = getPivot(a, first, last);

       ...
   }

   public void sort(int a[]) {
       sort(a, 0, a.length - 1);
   }

   public void setValues(int[] values) {
       this.values = values;
   }

}
_M#] 여기서 getPivoit 메소드가 비어있는 탬플릿이 됩니다. 이 것을 구현하는 하위 클래스들은 pivot을 구하는 방법에 따라 getPivot 메소드를 다르게 구현할 것입니다.

Pivot은 다음과 같이 세가지 방법으로 구현하라고 하였습니다.
   a. 가장 오른쪽 인자를 Pivot으로 하는 경우.
   b. 가장 오른쪽 인자를 Pivot으로 하는 경우.
   c. Random하게 Pivot을 선택하는 경우.

간단하게 구현과 테스트가 가능합니다.