알고리즘/백준

[백준 2750번, 1427번] 정렬(Java)

이채림 2024. 10. 24. 01:54
버블(bubble) 
데이터의 인접 요소끼리 비교하고, swap 연산을 수행하며 정렬하는 방식
선택(selection)
대상에서 가장 크거나 작은 데이터를 찾아가 선택을 반복하면서 정렬하는 방식
삽입(insertion)
대상을 선택해 정렬된 영역에서 선택 데이터의 적절한 위치를 찾아 삽입하면서 정렬하는 방식
퀵(quick)
pivot 값을 선정해 해당 값을 기준으로 정렬하는 방식
병합(merge)
이미 정렬된 부분 집합들을 효율적으로 병합해 전체를 정렬하는 방식
기수(radix)
데이터의 자릿수를 바탕으로 비교해 데이터를 정렬하는 방식

 

 

버블 정렬(bubble sort) [O(n2)]

: 두 인접한 데이터의 크기를 비교해 정렬하는 방법

loop를 돌면서 swap 연산

만약 특정한 루프의 전체 영역에서 swap이 한 번도 발생하지 않았다면 그 영역 뒤에 있는 데이터가 모두 정렬됐다는 뜻이므로 프로세스를 종료해도 된다.

 

 

015. 수 정렬하기 1(백준 2750번)

Arrays.sort()를 써서 풀 수 있지만 버블 정렬로 풀어보자!

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        int[] arr = new int[n];
        for(int i=0; i<n; i++) {
            arr[i] = sc.nextInt();
        }

        for(int i=0; i<n-1; i++) {
            for(int j=0; j<n-i-1; j++) {
                if(arr[j+1] < arr[j]) {
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        for(int i=0; i<n; i++) {
            System.out.println(arr[i]);
        }
    }
}

 

 

선택 정렬(selection sort) [O(n2)]

: 대상 데이터에서 최대나 최소 데이터를 데이터가 나열된 순으로 찾아가며 선택하는 방법

➡️ 구현 방법이 복잡하고, 시간 복잡도도 효율적이지 않아 코딩 테스트에서는 많이 사용되지 않는다.

 

 

 

 

왜 O(n2)인가 ❓

 

맨 처음 최솟값(혹은 최댓값)을 찾기 위해 n만큼 탐색한다.

다음은 n-1 만큼 탐색, .. , n-n 만큼 탐색한다.

결국 n만큼 탐색하는 걸 n번 반복하는거니까

n*n = n2

 

 

 

 

 

017. 내림차순으로 자릿수 정렬하기(백준 1427번)

 

이 문제는 자연수를 받아 자릿수별로 정렬하는 문제이므로 

N이 1,000,000,000으로 매우 커보이지만 실은 10 자릿수로 O(n2) 알고리즘을 사용해도 괜찮다.

 

 

 

삽입 정렬(insertion sort) [O(n2)]

: 이미 정렬된 데이터 범위에 정렬되지 않은 데이터를 적절한 위치에 삽입시켜 정렬하는 방식