안녕하세요. Mommoo 입니다.
앞으로 버블 정렬,선택 정렬, 삽입 정렬, 힙 정렬, 퀵 정렬을 만들어 볼텐데요,
이러한 정렬 들을 만들기 쉽게, 디버깅을 편하게 하기 위해 조상 클래스 Sort를 만들어 보고자 합니다.
기본목표는 아래와 같습니다.
- 정렬들간의 비교분석을 위해 같은 배열 데이터를 참조하게 한다.
- 데이터의 갯수만 변경하면 데이터가 갯수에 맞게, 랜덤값이 자동적으로 생성되게 한다.
- 정렬들간의 비교를 위하여 공통된 행위 설계. ( sort할때 걸리는 시간, sort가 성공했는지 여부, 규격화된 디버깅 설계 등등...)
- Comparable 인터페이스를 구현 해, Sort클래스를 상속받는 수 많은 정렬 클래스들이 시간 순으로 랭크화 하게 한다.
먼저 완성된 소스입니다.
/** | |
* Created by mommoo on 2017-04-05. | |
*/ | |
public abstract class Sort implements Comparable<Sort>{ | |
public final static int DATA_LENGTH = 10_000; | |
private final static int[] NOT_SORTED_DATA_ARRAY = new int[DATA_LENGTH]; | |
private final static int[] SORTED_DATA_ARRAY = new int[DATA_LENGTH]; | |
private final static Random R = new Random(); | |
private final static StringBuilder REGULATION_BUILDER = new StringBuilder(); | |
private static int maxNameLength,maxTimeLength; | |
private long startTime, endTime; | |
static{ | |
/* Input random values in array*/ | |
for(int i = 0 ; i < DATA_LENGTH ; i ++) NOT_SORTED_DATA_ARRAY[i] = R.nextInt(DATA_LENGTH); | |
/* Copy array : Copy NOT_SORTED_DATA_ARRAY to SORTED_DATA_ARRAY */ | |
System.arraycopy(NOT_SORTED_DATA_ARRAY,0,SORTED_DATA_ARRAY,0,DATA_LENGTH); | |
/* Sort Array to using that compare custom sort */ | |
Arrays.sort(SORTED_DATA_ARRAY); | |
} | |
/* Child class have to use this array */ | |
protected final int[] TARGET_DATA_ARRAY = new int[DATA_LENGTH]; | |
protected Sort(){ | |
/* Copy array : Copy NOT_SORTED_DATA_ARRAY to TARGET_DATA_ARRAY */ | |
System.arraycopy(NOT_SORTED_DATA_ARRAY,0,TARGET_DATA_ARRAY,0,DATA_LENGTH); | |
} | |
/* Child class have to over-write sort method in an independent-way */ | |
protected abstract void sort(); | |
/* Child class have to over-write getSortName method to obtain name of sort */ | |
protected abstract String getSortName(); | |
/* Sort start */ | |
protected void start(){ | |
/* Begin save sort times */ | |
startTime = System.nanoTime(); | |
sort(); | |
endTime = System.nanoTime(); | |
/* Catch longest text-length */ | |
int classNameLength = getSortName().length(); | |
if(maxNameLength < classNameLength) maxNameLength = classNameLength; | |
int spendTimeTextLength = getSpendTimeText().length(); | |
if(maxTimeLength < spendTimeTextLength) maxTimeLength = spendTimeTextLength; | |
} | |
/* Swap two values in array */ | |
protected void swap(int index1, int index2){ | |
int temp = TARGET_DATA_ARRAY[index1]; | |
TARGET_DATA_ARRAY[index1] = TARGET_DATA_ARRAY[index2]; | |
TARGET_DATA_ARRAY[index2] = temp; | |
} | |
/* Create result string */ | |
protected String sortResult(int beginIndex , int endIndex){ | |
final int LENGTH = endIndex - beginIndex + 1; | |
int[] temp = new int[LENGTH]; | |
System.arraycopy(TARGET_DATA_ARRAY,beginIndex,temp,0,LENGTH); | |
return Arrays.toString(temp); | |
} | |
/* Create formatted time string */ | |
private String getSpendTimeText(){ | |
return String.format("%,d",getSpendTime()) + " ns"; | |
} | |
/* Fill remain space */ | |
private String regulate(String text,int remain){ | |
REGULATION_BUILDER.delete(0,REGULATION_BUILDER.toString().length()); | |
REGULATION_BUILDER.append(text); | |
for(int i = 0 ; i < remain ; i++) REGULATION_BUILDER.append(" "); | |
return REGULATION_BUILDER.toString(); | |
} | |
/* public API area */ | |
/* Get alignment time using by nano time */ | |
public long getSpendTime(){ | |
return endTime - startTime; | |
} | |
/* Get regulation name */ | |
public String getRegulationSortName(){ | |
String name = getSortName(); | |
int remain = maxNameLength - name.length(); | |
return regulate(name,remain); | |
} | |
/* Get regulation time string */ | |
public String getRegulationSpendTime(){ | |
String time = getSpendTimeText(); | |
int remain = maxTimeLength - time.length(); | |
return regulate(time,remain); | |
} | |
/* Inspect sort success */ | |
public boolean isSortSuccess(){ | |
for(int i = 0 ; i < DATA_LENGTH ; i ++){ | |
if(TARGET_DATA_ARRAY[i] != SORTED_DATA_ARRAY[i]) return false; | |
} | |
return true; | |
} | |
/* String of sort information */ | |
@Override | |
public String toString(){ | |
String message = "######################## ["+getRegulationSortName()+"] ########################\n"; | |
int bannerIntroLength = message.length() - 1; | |
message += sortResult(0,DATA_LENGTH-1)+"\n"; | |
message += "Time Spend : " + getRegulationSpendTime() +"\n"; | |
message += "Is Soring Success : " + isSortSuccess()+"\n"; | |
for(int i=0; i<bannerIntroLength; i++) message+="#"; | |
return message; | |
} | |
/* Overwrite method to rank child-class of Sort-class */ | |
@Override | |
public int compareTo(Sort object) { | |
return (int)(getSpendTime() - object.getSpendTime()); | |
} | |
} |
특이점등을 설명해드리자면...
▶ 6번의 DATA_LENGTH 변수는 추후에, 데이터 갯수를 표시하기 위해 public으로 공개했습니다.
▶ 16번의 static 초기화 부분에서는 자동적으로 랜덤 값을 넣어주며, sort가 성공했는지 여부를 알기 위해
미리 sort된 배열도 하나 만들었습니다.
▶ 각각의 자식 클래스마다 공통된 배열의 값을 참조를 해야하지만, 자식만의 배열을 가져야 하므로,
28번의 배열을 protected로 추가했습니다.
▶ 36, 39번의 메서드는 각 자식 클래스마다 독립적인 내용이므로 자식에게 구현을 맡겼습니다.
▶ 42번의 start 메서드는 자식 클래스가 start 메서드를 사용했을시, sort가 진행되고 sort 진행시간이 기록됩니다.
또한, 프린팅을 줄 맞춰서 예쁘게 하기위해, 프린팅 정보중 너비가 제일 긴 텍스트의 길이를 저장했습니다.
▶ 58번의 swap 함수는 sort에서 빠지지 않는 swap기능을 미리 구현해놓았습니다.
▶ 117번의 toString메서드는 자식 클래스의 소트가 진행됬을경우, 정보를 프린팅 하기위해 구현했습니다.
▶ 129번의 compareTo 메서드는 Comparable을 구현하기위해 오버라이딩 했습니다. 추후에
자식클래스들을 시간순으로 정렬하기 위해 작성했습니다.
준비한 내용은 여기까지 입니다.
다음 포스팅은, 이러한 Sort 클래스를 상속받아 Bubble 소트를 만들어보겠습니다!
'알고리즘' 카테고리의 다른 글
퀵정렬 알고리즘 개념 분석하기 (0) | 2020.01.26 |
---|---|
[자바 데이터 정렬 프로젝트] 버블정렬 - 코드 (2) | 2017.05.17 |
[자바 데이터 정렬 프로젝트] 버블정렬 - 이론 (0) | 2017.04.24 |
[자바 데이터 정렬 프로젝트] 프로젝트 개요. (2) | 2017.04.07 |
포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.