자바 오름차순/내림차순 정렬 공식

jinvicky·2025년 4월 8일

Algorithm - Java

목록 보기
66/68

로직 떠올리기에 더 시간을 들이기 위해서 정렬 코드를 외워보자.
원시형, 객체형, 사용자 정의 객체형으로 기준을 나누었다.
배열, 큐 등이 제일 먼저 정렬 대상으로 떠오른다.

오름차순 정렬

원시형 배열

int[] arr = new int[]{4,5,7,8,1};
  • Arrays.sort()를 사용하면 끝. 문자열 배열도 이렇게 정렬할 수 있다.
Arrays.sort(arr);
  • 우선순위 큐는 요소를 추가하는 것만으로 자동 순차 정렬을 해준다.
PriorityQueue<Integer> pq = new PriorityQueue<>();

참조형 배열

2차원 배열을 특정 기준에 따라 정렬하려면 Comparator를 사용해야 한다.
람다식을 사용한 간단한 표현과 직접 Comparator를 오버라이딩하는 방법이 있다.

a가 왼쪽이면 오름차순, b가 왼쪽이면 내림차순이다.

  • 람다식
 Arrays.sort(students, (a, b) -> {
            if (a[1] == b[1]) {
                return Integer.compare(a[0], b[0]); // 0번째 요소 기준 오름차순
            }
            return Integer.compare(b[1], a[1]); // 1번째 요소 기준 내림차순
});
  • Comparator 객체 직접 오버라이딩
 Arrays.sort(students, new Comparator<int[]>() {
            @Override
            public int compare(int[] a, int[] b) {
                if (a[1] == b[1]) {
                    return Integer.compare(a[0], b[0]); // 0번째 요소 기준 오름차순
                }
                return Integer.compare(b[1], a[1]); //  1번째 요소 기준 내림차순
            }
        });

사용자 정의 객체 자료구조

사용자 정의 객체로 이루어진 배열이라면 a[0] 식으로 인덱스로 접근할 수 없다.

  • 람다식
    이름별로 오름차순, 이름이 동일하면 점수별로 오름차순 정렬한다.
Arrays.sort(students, (s1, s2) -> {
    if (s1.getName().equals(s2.getName())) { // 이름이 동일할 때 
        return Integer.compare(s1.getScore(), s2.getScore()); // 점수 오름차순
    }
    return s1.getName().compareTo(s2.getName()); // 이름 오름차순
});
  • Comparator 객체 오버라이딩
Arrays.sort(students, new Comparator<Student>() {
    @Override
    public int compare(Student s1, Student s2) {
        if (s1.getName().equals(s2.getName())) {
            // 이름이 같을 경우 -> 점수 오름차순 정렬
            return Integer.compare(s1.getScore(), s2.getScore());
        }
        // 이름 오름차순 정렬
        return s1.getName().compareTo(s2.getName());
    }
});

내림차순 정렬

참조형 자료구조

참조형 자료구조들은 아래처럼 Collections.reverseOrder()로 쉽게 해결가능하다.
혹은 순차 정렬에서 ab의 위치를 변경하면 된다.

Arrays.sort(arr, Collections.reverseOrder()); // 배열 내림차순 정렬 
PriotiryQueue<>(Collections.reverseOrder()); // 선언 시 우선순위 큐 내림차순 정렬

원시형 자료구조

Arrays.sort(arr, Collections.reverseOrder()) 로 해결할 수 없다.

  • 코테 문제가 꼭 for문이 필요하지 않다면 while문과 index 변수로 내림차순 출력할 수 있다.
int index = arr.length - 1;
while (index >= 0) { 
	System.out.print(arr[index] + " ");
    index--;
}
  • 아니면 오름차순 정렬한 배열을 다른 배열에 내림차순으로 저장할 수 있다.
int[] arr = {1, 5, 3, 4, 2};

// 1. 오름차순 정렬
Arrays.sort(arr);

// 2. 새로운 배열 선언 (역순으로 값을 할당할 배열)
int[] reversedArr = new int[arr.length];

// 3. 역순으로 할당하기 (Arrays.sort() 결과를 뒤집어서 저장)
for (int i = 0; i < arr.length; i++) {
	reversedArr[i] = arr[arr.length - 1 - i]; // 가장 뒤부터 값을 가져옴        
}

사용자 정의 객체 자료구조

마찬가지로 순차 정렬에서 a와 b의 위치를 바꾸면 된다.

profile
개발, 그림, 기록

0개의 댓글