케팔스 2021. 9. 22. 14:50

정렬관련 내용을 따로 여기에다가 정리할 예정이나 일단은 알고리즘 관련 내용으로 정리한다.(문제 풀이 위주)

조건

- 정렬 조건이 필요함.

- 시간 복잡도는 약 O(NlogN)

- In-place/ stable여부

 

특성

 - 같은 정보들은 인접해있다

.- 각 원소마다 가장 비슷한 순서의 다른 원소는 자신의 양 옆이다.

- 정렬로 문제가 쉽게 풀리는 경우가 많다.

 

1.1 조건

static class Elem implements Comparalbe<Elem>{
	public int num, idx;
    
    @Override
    public int compareTo(Elem other){
    	return num - other.num;
    }
    // Return 음수 : 내가 먼저(오름차순)
    // Return 양수 : 비교대상 먼저 (other ) (내림차순)
    // Return 0 같다.
    
    // 내것 기준 
    // 내것이 크면 먼저하고 싶다면? (큰순서대로라는 뜻 내림차순)
    // 양수
    // 내 것이 작으면 먼저하고 싶다면(작은 순서대로 오름차순)
    // o.num - num;
    //즉, return 값이 양수이면 먼저오도록한다.라고 이해
}

1.2 시간 복잡도

Java의 Arrays.sort(arr) 

primitive : Dual-pivot Quick Sort

Object : Tim sort

최선 O(N) // 최악 O(NlogN) 평균 O(NlogN)

 

1.3 In-place /stable 여부

정렬 알고리즘이 In-place(제자리)한가?

=> 정렬과정에서 N에 비해 충분히 무시할만한 개수의 메모리만큼 '추가적'으로 사용하는가

정렬 알고리즘이 Stable(안정)한가?

=> 동등한 위상의 원소들의 순서 관계가 보존되는가?

=> a(1) b a(2) c  일때 a(1) a(2) b c 인지 a(2) a(1) b c인지.

primitive에서 사용하는 dual-pivot quick sort는 in-place

object에서 사용하는 tim sort는 stable sort

 

 

국영수 Q10825 백준

삼항 연산자 중첩을 통해서 구현하였는데

private static class Student implements Comparable<Student> {
        String name;
        int korean;
        int math;
        int english;

        Student(String name, int korean, int math, int english) {
            this.name = name;
            this.korean = korean;
            this.math = math;
            this.english = english;
        }

        // 내림 오름 내림 오름 국어 수학 영어 이름
        @Override
        public int compareTo(Student o) {
            return o.korean - korean != 0 ? o.korean - korean
                    : math - o.math != 0 ? math - o.math
                            : o.english - english != 0 ? o.english - english : name.compareTo(o.name);
        }
    }

class 안에서 정의하는 것보다 밖에서 list.sort(new Comparaotr)로 하는 것이 더 빨라보이고

삼항연산자보다 if/else문이 빨라보이며 여튼 시간이 꽤 걸리네.

 

 

Internal sorting vs external sorting

stable sorting vs unsatble sorting