정렬

: 특정 규칙 순서대로 요소들을 나열하는 것.

container 구조에서 활용

arraylist, 또는 배열에서 많이 사용

treemap같은 경우 이미 정렬된 상태

(deque, queue, stack, hm ← 정렬하면 안되는 구조)

정렬

→ 오름차순 정렬 (default*)

→ 내림차순 정렬 (솔직히 필요는 없음 ← 기본 정렬이 아닌 자료구조의 우선순위)

⇒ 오름차순 정렬로 두고 뒤에서부터 보면 되기 때문에 굳이 정렬할 필요가 없음.

Integer[] arr = {3, 4, 5, 1, 2};
// 기본 정렬 -> 오름차순의 기본 정렬
Arrays.sort(arr);
for (int i=0; i<arr.length; i++)
		System.out.print(arr[i]);
System.out.println();

// 내림차순 정렬
// 배열 또는 arraylist에서 내림차순 정렬 할 이유 X
// -> 오름차순 정렬로 두고 뒤에서부터 보면 되기 때문
// treemap, priority queue →
// arrays.sort(container, Comparator)
// comparator = compare + ator class
// Comparator를 통해서 정렬 조건을 바꾸고 싶다면 → Wrapper type
Arrays.sort(arr, new cmp());
for (int i=0; i<arr.length; i++)
		System.out.print(arr[i]);
System.out.println();

// 얘랑 똑같은걸
Arrays.sort(arr, Collections.reverseOrder());
for (int i=0; i<arr.length; i++)
		System.out.print(arr[i]);
System.out.println();

// ArrayList 정렬
ArrayList<Integer> al = new ArrayList<>();
al.add(3);
al.add(1);
al.add(2);
Collecions.sort(); // Collections.reverseOrder() 사용 가능
for (int elem : al) {
		System.out.print(elem + " ");
}
System.out.println();

Comparator

static class cmp implements Comparator <Integer> {
		@Overide
		public int compare(Integer left, Integer right) {
				// left < right
				// right는 항상 left보다 커야 오름차순이 생성된다.
				// left - right = 음수 // 내가 원하는 오름차순이 유지될려면
				// left < right -> 음수를 리턴하게 된다.
				// right - left = 양수
				// return right - left;
				
				// -> 일단 모든 언어 공통으로 사용가능
				// -> java = int return, c++ = bool return
				
				// left < right 내가 우너하는 상황이다 ! -> 라고 하면 음수 리턴
				// 1 5
				if (left < right) return -1;
				// 5 1 -> 내가 원하는 오름차순의 상황이 아닌 것 -> 양수를 리턴
				if (left > right) return 1;
				// 마지막 무지성으론 stability
				return 0;
				// 내림차순 하고 싶으면 부등호만 바꿔주면 됨.
		}
}

class 정렬

static class Node {
		int y;
		int x;
		Node (int y, int x) {
				this.y = y;
				this.x = x;
		}
}

Node[] nodearr = new Node[5];
nodearr[0] = new Node(0, 0);
nodearr[1] = new Node(1, 100);
nodearr[2] = new Node(100, 1);
nodearr[3] = new Node(3, 5);
nodearr[4] = new Node(3, 500);

// y가 작은거 우선, x가 큰거 우선
Arrays.sort(nodearr);
for (int i=0; i<5; i++) {
		System.out.println(nodearr[i].y + " " + nodearr[i].x);
} // -> 에러 발생

// 1. 외부로 비교 가능한 코드를 만들어주는 방식
static class nodecmp implements Compatator <Node> {
		@Override
		public int compare(Node left, Node right) {
				// 원하는 조건을 우선순위가 높은 순으로 작성
				if (left.y < right.y) return -1;
				if (left.y > right.y) return 1;
				if (left.x > right.x) return -1;
				if (left.x < right.x) return 1;
				return 0;
		}
}

// 2. compare + able => 비교가 가능한 class로 만든다
static class Node implements Comparable <Node>{
		int y;
		int x;
		Node (int y, int x) {
				this.y = y;
				this.x = x;
		}
		@Override
		public int compareTo(Node o) {
				// 나 자신이 left, o = right
				if (y < o.y) return -1;
				if (y > o.y) return 1;
				if (x > o.x) return -1;
				if (x < o.x) return 1;
				return 0;
		}
}

→ pro 시험에서 정렬 쓸 일 많지 않음

→ #1. api 호출이 50만번인데 호출될때마다 정렬? 비효율적임

→ 정렬된게 필요하면 treemap 사용. 삽입때마다 log(N)