본문 바로가기
algorithm/Baekjoon

[백준] 2750 수 정렬하기(Arrays.sort, 선택, 삽입, 퀵)

by 이쟝 2022. 10. 13.

문제

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

출력

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

예제 입력 1 복사

5
5
2
3
4
1

예제 출력 1 복사

1
2
3
4
5

1. Arrays.sort 사용하기

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.io.IOException;

public class Main {

	public static void main(String[] args)throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		int arr[] = new int[n];
		for(int i=0;i<n;i++) {
			arr[i] = Integer.parseInt(br.readLine());
		}
		Arrays.sort(arr); 
		for(int val:arr) {
			System.out.println(val);
		}
	}
}

2. 선택정렬 사용하기

선택정렬(첫번째 인덱스부터 시작해 뒤의 인덱스들의 값과 비교) : 제일 기본 시간복잡도는 On2

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {

	public static void main(String[] args)throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		int arr[] = new int[n];
		for(int i=0;i<n;i++) {
			arr[i] = Integer.parseInt(br.readLine());
		}
		selection_sort(arr);  
		for(int val:arr) {
			System.out.println(val);
		}
	}
	public static void selection_sort(int[] arr) {
		for(int i=0;i<arr.length;i++) {
			for(int j=i+1;j<arr.length;j++) {
				if(arr[i]>arr[j]) {
					swap(arr,j,i);
					int temp = arr[j];
					arr[j] = arr[i];
					arr[i] = temp;
				}
			}
		}
	}
}

3. 삽입정렬 사용하기

삽입정렬(선택한 요소를 앞쪽의 알맞은 위치에 삽입하는 작업 반복 정렬): On2(최선일때O(N))

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {

	public static void main(String[] args)throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		int arr[] = new int[n];
		for(int i=0;i<n;i++) {
			arr[i] = Integer.parseInt(br.readLine());
		}
		insertion_sort(arr); 
		for(int val:arr) {
			System.out.println(val);
		}
	}
    
	public static void insertion_sort(int[] arr) {
		for(int i=1;i<arr.length;i++) {
			int temp = arr[i];
			int j;
			for(j=i; j>0 && arr[j-1] > temp; j--) {
				arr[j] = arr[j-1];
			}
			arr[j] = temp;
		}
	}
}

4. 퀵정렬 사용하기

피벗(기준)을 삼아서 기준 보다 작은 값을 왼쪽에, 큰 값을 오른쪽에 두고 재귀 수행하며 정렬(분할정복)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {

	public static void main(String[] args)throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		int arr[] = new int[n];
		for(int i=0;i<n;i++) {
			arr[i] = Integer.parseInt(br.readLine());
		}
		quick_sort(arr,0,arr.length-1);  
		for(int val:arr) {
			System.out.println(val);
		}
	}

	public static void quick_sort(int[] a, int start, int end) {
		if(start>=end) return; // left가 right보다 크거나 같으면 정렬할 원소가 1개 이하, 정렬 x
		int pl = start;
		int pr = end;
		int pivot = a[(start+end)/2];
		
		while(pl<=pr) {
			while(a[pl]<pivot) {
				pl++;  // 피벗보다 큰 데이터를 찾을 때까지 반복
			}
			while(a[pr]>pivot) {
				pr--;  // 피벗보다 작은 데이터를 찾을 때까지 반복
			}
			if(pl<=pr) {  // 작은값이 오른쪽보다 더 커지지 않을 때만
				swap(a,pl,pr); // 서로의 값 교환
				pl++;
				pr--;
			}
		}
		if(start<pr)quick_sort(a,start,pr);
		if(end>pl) quick_sort(a,pl,end);
	}
	
	private static void swap(int[] a, int i, int j) {
		int temp = a[i];
		a[i] = a[j];
		a[j] = temp;
	}
}

 

  • 처음에 정렬을 접했을 때는 이게 무슨 소리인가.. 이게 뭐냐.. 이런 느낌이었다면 한 번 봤더니 어떻게 로직이 구현되는 것인지 이해가 됐다. 
  • StringBuilder를 써서 출력해도 되는데 맨 마지막에 항상 \n이 더 추가된다..!
  • 속도는 Arrays.sort가 136, 선택정렬이 144, 삽입정렬이 148, 퀵정렬이 148이었다. 퀵정렬이 빠르다고 해서 기대를 했는데 삽입정렬과 같아서 놀랐다.. 알고보니 
퀵정렬은 대표적인 '분할 정복' 알고리즘으로 평균속도가 O(N*log N)이다. (하지만 항상 N*logN은 아니고 pivot값에 따라 최악 시간 복잡도는 O(N^2)가 될 수 있다.예)이미 정렬이 되어 있는 경우)
  • Arrays.sort가 제일 빠를 줄은 몰랐다..
  • swap 메서드는 이제.. 눈 감고도.. 할 수 있을 것 같다.. 이해했다구..!

2022.01.26 - [멀티캠퍼스 풀스택 과정/알고리즘] - 알고리즘1-6. 정렬(Sorting): 버블정렬, 선택정렬, 삽입정렬, 퀵정렬

 

알고리즘1-6. 정렬(Sorting): 버블정렬, 선택정렬, 삽입정렬, 퀵정렬

정렬이란? 데이터를 특정한 기준에 따라 순서대로 나열하는 것 키 값이 작은 작은 데이터를 앞쪽에 넣으면 오름차순(ascending order)정렬, 그 반대로 놓으면 내림차순(descending order)정렬 정렬 알고리

everysmallstep.tistory.com

https://st-lab.tistory.com/250

 

자바 [JAVA] - 퀵 정렬 (Quick Sort)

[정렬 알고리즘 모음] 더보기 1. 계수 정렬 (Counting Sort) 2. 선택 정렬 (Selection Sort) 3. 삽입 정렬 (Insertion Sort) 4. 거품 정렬 (Bubble Sort) 5. 셸 정렬 (Shell Sort) 6. 힙 정렬 (Heap Sort) 7. 합..

st-lab.tistory.com

https://12216715011126.tistory.com/39

 

[2750] 수 정렬하기 - 퀵정렬 (java)

Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 import java.io.BufferedReader; import jav..

12216715011126.tistory.com

 

'algorithm > Baekjoon' 카테고리의 다른 글

Do it 알고리즘 코딩테스트  (0) 2023.04.30
[11720] 숫자의 합  (0) 2023.04.30
[백준] 2908 상수  (0) 2022.10.11
[백준] 1157 단어 공부  (0) 2022.10.05
[백준] 2675 문자열 반복  (0) 2022.10.05