본문 바로가기

프로그래밍/Algorithm - 1

5. Introduction of Sort

우리의 Sort의 목적은 정렬가능한 임의의 데이터 타입을 특정한 순서에 따라 정렬시키는 것이다.

 

sort() 함수는 내부적으로 요소의 비교를 위해 compareTo() 함수를 호출할 수 있다.

java에서 이것은 Comparable interface에 정의되어 있다.

 

public interface implements Comparable<Item>{
    public int compareTo(Item that){
    }
}

 

아래는 이것을 구현한 것이다.

 

//comparable interface를 구현한 Date자료구조, total order를 만족하기때문에 정렬가능하다.

public class Data implements Comparable<Date>{
	private final int month, day, year;
    
    public Date(int m, int d, int y){
    	month = m;
        day = d;
        year = y;
    }
    //Argument보다 작으면 -1, 크면 1, 같으면 0 return
    public int compareTo(Date that){
    	if (this.year < that.year) return -1;
        if (this.year > that.year) return +1;
        if (this.month < that.month) return -1;
        if (this.month > that.month) return +1;
        if (this.day < that.day) return -1;
        if (this.day > that.day) return +1;
        return 0;
    }
}

 

우리는 Comparable interface를 구현한 자료구조의 배열를 sort의 argument로 받음으로서, comparable의 method인 compareTo()함수를 sort내부에서 사용하도록 할 수 있고, 따라서, 자료구조의 종류에 따라 sort함수를 변경함 없이 comparable한 모든 자료구조의 정렬을 처리할 수 있다.

 

public static void sort(Comparable[] a){
	...
    ...	a[j].compareTo(a[j-1]) ...
    ...
}

 

하지만 집합내 모든 요소가 정렬 불가능 할 수 있다. 

정렬가능하기 위해서는 집합내 모든 요소에 대해  total order를 만족시켜야 한다.

우리가 아는 일반적인 숫자 집합은 이것이 모두 성립함이 증명되어있다.

1. Antisymmetry :  if v<= w and w <=v, then v=w 

2. Transitivity : if v<=w and w<=x, then v<=x

3. Totality : either v<=w or w<=v or both

 

예를 들어, 가위바위보 집합을 생각해보자. 집합은 {가위, 바위, 보} 이다.

첫번째, Antisymmetry를 성립하는지 알아보자.

첫번째 명제의 대우는, v != w, then v>w or v<w 이다.

v, w가 서로 다를 때 이기고 지는것이 명확하고, 모든케이스에 대해 만족하므로 이것은 참이다.

두번째, Transitivity가 성립하는지 알아보자.

v = 가위, w = 주먹, x = 보 라고 생각해보자

v <= w, w<= x는 참이다. 그런데, v<=x는 보가 가위를 이기지 못하므로 거짓이다.

따라서, Transitivity가 위배되어 가위바위보 집합은 정렬 불가능하다.

 

정렬이후에 잘 정렬되었는지 여부 확인은 isSorted()를 구현함으로서 확인 할 수 있다.

이것은 다음과 같이 구현가능하다.

 

private static boolean isSorted(Comparable[] a){
	... // iterate
    ... if(less(a[i], a[i-1]) return false;
    ...
}

 

그렇다면 이 테스트를 통과하면, 정말 정렬이된것인가? 

만약, sort()가 단순히 데이터 비교와 데이터 자리바꿈(교환)만으로 이루어졌다면 그렇다고 할 수 있다.

하지만, sort의 구현의 일부가 집합의 요소의 값을 일시적으로 변경시키거나 추가/제거 한다면,

비교전의 집합과 비교후의 집합이 동일하다는 보장이 없으므로, 정렬되었다고 확신할 수 없다.

'프로그래밍 > Algorithm - 1' 카테고리의 다른 글

7. Merge sort  (1) 2023.12.16
6. Selection sort, Insertion sort, Shell sort  (0) 2023.12.12
4. Bag, Stack, Queue  (1) 2023.12.03
3. Analysis of algorithms  (0) 2023.11.27
2. Union-Find  (1) 2023.11.20