full stack/JAVA

[μžλ£Œκ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜] μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜, 탐색 μ•Œκ³ λ¦¬μ¦˜ (2023.04.04)

Shinjio 2023. 4. 23. 18:25
λ°˜μ‘ν˜•

🎈 μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜

μ›μ†Œλ“€μ„ μΌμ •ν•œ μˆœμ„œλŒ€λ‘œ μ—΄κ±°ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜

πŸ“– μ‚½μž…μ •λ ¬ 

νŠΉμ •ν•œ 데이터λ₯Ό μ μ ˆν•œ μœ„μΉ˜μ— μ‚½μž…ν•˜λŠ” μ •λ ¬

데이터가 거의 μ •λ ¬ λ˜μ–΄ μžˆμ„ λ•Œ 효율적

 

πŸ“– 병합정렬

μ£Όμ–΄μ§„ 자료λ₯Ό 잘게 μͺΌκ°  λ’€ ν•©μΉ˜λŠ” κ³Όμ •μ—μ„œ μ •λ ¬

 

πŸ“– 퀡정렬 

κΈ°μ€€ ν‚€(pivot)λ₯Ό κΈ°μ€€μœΌλ‘œ μž‘κ±°λ‚˜ 같은값을 μ§€λ‹Œ λ°μ΄ν„°λŠ” μ•žμœΌλ‘œ, 큰 값을 μ§€λ‹Œ λ°μ΄ν„°λŠ” λ’€λ‘œ 가도둝 ν•˜μ—¬ 데이터λ₯Ό 뢄리해가며 μ •λ ¬

μ™Όμͺ½μ—μ„œ μ‹œμž‘ν•œ ν‚€λŠ” 기쀀킀보닀 크면, 였λ₯Έμͺ½μ—μ„œ μ‹œμž‘ν•œ ν‚€λŠ” 기쀀킀보닀 μž‘μœΌλ©΄ 멈좀

두 개의 자리λ₯Ό λ°”κΏˆ

두 개의 μ»€μ„œκ°€ λ§Œλ‚˜λ©΄ μ™Όμͺ½μœΌλ‘œλŠ” 기쀀킀보닀 μž‘μ€ κ°’λ§Œ, 였λ₯Έμͺ½μ—λŠ” 기쀀킀보닀 큰 κ°’λ§Œ λ‚¨μŒ

 

πŸ“– λ²„λΈ”μ •λ ¬

두 μΈμ ‘ν•œ μ›μ†Œλ₯Ό λΉ„κ΅ν•˜μ—¬ μ •λ ¬ν•˜λŠ” 방법

ν•œ ν„΄λ§Œ λλ‚˜λ„ κ°€μž₯ 큰 μˆ«μžκ°€ 제일 뒀에 있음

μ‹œμž‘μ€ 인덱슀 0, 1λΆ€ν„° > 1, 2 > 2, 3 > ... > n-1, nκΉŒμ§€ 확인   ---- 1회차

0,1 > 1,2 > 2,3 > ... >n-2, n-1 ----- 2회차

...

μ΅œλŒ€ n-1νšŒμ°¨κΉŒμ§€ μ§„ν–‰

 

μž₯점

- μΈμ ‘ν•œ κ°’λ§Œ κ³„μ†ν•΄μ„œ λΉ„κ΅ν•˜λŠ” λ°©μ‹μœΌλ‘œ κ΅¬ν˜„μ΄ 쉽닀. >> μΉ˜ν™˜μ΄ 많이 이루어진닀. 

- μ½”λ“œκ°€ 직관적이닀.

- 쀑간에 멈좜 수 있음

 

단점

- ν•˜λ‚˜μ˜ μš”μ†Œκ°€ κ°€μž₯ μ™Όμͺ½μ—μ„œ κ°€μž₯ 였λ₯Έμͺ½μœΌλ‘œ μ΄λ™ν•˜λ €λ©΄ λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œμ™€ κ΅ν™˜ λ˜μ–΄μ•Ό 함

- νŠΉμ • μš”μ†Œκ°€ μ΅œμ’… μ •λ ¬ 결과에 λ§žλŠ” μœ„μΉ˜μ— μžˆλ”λΌλ„ κ΅ν™˜λ˜λŠ” 일이 일어날 수 있음

 

즉, κ΅¬ν˜„μ΄ λ‹¨μˆœν•˜μ§€λ§Œ λŠλ¦¬λ‹€. 

 

package μ•Œκ³ λ¦¬μ¦˜;

import java.util.Arrays;

public class Ex01버블정렬_λ‚΄λ¦Όμ°¨μˆœ {

	public static void main(String[] args) {
		//λ‹€μŒ 배열을 버블 μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•˜μ—¬ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œ ν›„ 결과와 κ΅ν™˜ 횟수 좜λ ₯
		
		int[] arr = {6,8,2,1,4,3};
		int cnt = 0;
		boolean sw = true;
		
		for(int k = 0 ; k < arr.length - 1 ; k++) {
			sw = true;
			for(int i = 0 ; i < arr.length - k - 1 ; i++) {
				if(arr[i] < arr[i+1]) {
					int temp = arr[i];
					arr[i] = arr[i+1];
					arr[i+1] = temp;
					sw = false;
				}
			}
			if(sw) {
				break;
			}
			
			System.out.println(k+1 + "회차 : " + Arrays.toString(arr));
		}
	}
}

 

πŸ“– 선택 μ •λ ¬

κ°€μž₯ 큰 μ›μ†Œ λ˜λŠ” μž‘μ€ μ›μ†Œλ₯Ό μ°Ύμ•„ μ£Όμ–΄μ§„ μœ„μΉ˜λ₯Ό ꡐ체해 λ‚˜κ°€λŠ” μž‘μ—…

 

κ°€μž₯ μž‘μ€ μˆ˜κ°€ μžˆλŠ” 인덱슀λ₯Ό κΈ°μ–΅ν•˜λŠ” λ³€μˆ˜ ν•„μš”

0번 μΈλ±μŠ€μ™€ 1~n-1번 μΈλ±μŠ€κΉŒμ§€ ν•˜λ‚˜ν•˜λ‚˜ 비ꡐ해가며 κ°€μž₯ μž‘μ€ 숫자의 인덱슀λ₯Ό κΈ°μ–΅ν•΄λ‘μ—ˆλ‹€κ°€, μœ„μΉ˜ κ΅ν™˜

1번 μΈλ±μŠ€μ™€ 2~n-1번 μΈλ±μŠ€κΉŒμ§€ ν•˜λ‚˜ν•˜λ‚˜ 비ꡐ해가면 κ°€μž₯ μž‘μ€ 숫자의 인덱슀λ₯Ό κΈ°μ–΅ν•΄λ‘μ—ˆλ‹€κ°€, μœ„μΉ˜ κ΅ν™˜

μ΅œλŒ€ n-1νšŒμ°¨κΉŒμ§€ μ§„ν–‰

 

회차의 λ§ˆμ§€λ§‰μ—λ§Œ μΉ˜ν™˜. λ°”κΎΈλŠ”κ²Œ 적닀. -> 이λ₯Ό μœ„ν•΄ 인덱슀 번호λ₯Ό κΈ°μ–΅ν•œλ‹€. 

쀑간에 멈좜 수 μ—†μŒ. λκΉŒμ§€ λ΄μ•Όν•œλ‹€. 

 

μž₯점

- 정렬을 μœ„ν•œ 비ꡐ νšŸμˆ˜λŠ” λ§ŽμœΌλ‚˜ κ΅ν™˜ νšŸμˆ˜κ°€ 적기에 κ΅ν™˜μ΄ 많이 이루어져야 ν•˜λŠ” μƒνƒœμ—μ„œ 효율적

단점

- 이미 μ •λ ¬λœ μƒνƒœμ—μ„œ μ†Œμˆ˜μ˜ μžλ£Œκ°€ μΆ”κ°€λ˜λ©΄ μž¬μ •λ ¬ν•  λ•Œ 처리 속도가 느림

 

package μ•Œκ³ λ¦¬μ¦˜;

import java.util.Arrays;

public class Ex03μ„ νƒμ •λ ¬μ•Œκ³ λ¦¬μ¦˜_λ‚΄λ¦Όμ°¨μˆœ {

	public static void main(String[] args) {
		
		int[] arr = {6,8,2,1,4,3};
		int index;
		for(int i = 0 ; i < arr.length - 1 ; i++) {
			index = i; //indexλŠ” κ°€μž₯ 큰 수의 인덱슀 번호λ₯Ό μ €μž₯ν•˜λŠ” λ³€μˆ˜
			for(int j = index + 1 ; j < arr.length ; j++) {
				if(arr[j] > arr[index]) {
					index = j;
				}
			}
			int temp = arr[i];
			arr[i] = arr[index];
			arr[index] = temp;
			
			System.out.println(i+1 + "회차 : " + Arrays.toString(arr));
		}

	}

}

 

 

🎈 검색 μ•Œκ³ λ¦¬μ¦˜ 

νŠΉμ • μ›μ†Œλ₯Ό κ²€μƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜

 

πŸ“– μˆœμ°¨κ²€μƒ‰

κ°€μž₯ λ‹¨μˆœν•œ 검색 λ°©λ²•μœΌλ‘œ μ›μ†Œμ˜ 정렬이 ν•„μš”μ—†λ‹€. 

ν•˜μ§€λ§Œ 리슀트 길이가 κΈΈλ©΄ λΉ„νš¨μœ¨μ 

μ²˜μŒλΆ€ν„° λκΉŒμ§€ 순차적으둜 비ꡐ 

 

package μ•Œκ³ λ¦¬μ¦˜;

public class Ex05μˆœμ°¨κ²€μƒ‰μ•Œκ³ λ¦¬μ¦˜ {

	public static void main(String[] args) {
		
		int num = 78;
		
		int[] arr = {13,35,15,11,26,72,78,13,61,90};
		
		for(int i = 0 ; i < arr.length - 1 ; i++) {
			if(num == arr[i]) {
				System.out.println(i);
				break;
			}
		}

	}

}

 

πŸ“– 이진검색

리슀트의 쀑간 값을 μ •ν•΄ 크고 μž‘μŒμ„ 비ꡐ해 κ²€μƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜

μ •λ ¬λœ λ¦¬μŠ€νŠΈμ—μ„œλ§Œ μ‚¬μš©ν•  수 있음

 

첫번째 μΈλ±μŠ€μ™€ λ§ˆμ§€λ§‰ 인덱슀 사이 쀑간 번호 μΈλ±μŠ€μ™€ 찾고자 ν•˜λŠ” μˆ˜μ™€ 비ꡐ

찾고자 ν•˜λŠ” μˆ˜κ°€ 쀑간 번호 인덱슀의 값보닀 크면 쀑간값 μ΄ν›„μ˜ κ°’λ§Œ 확인

첫 μΈλ±μŠ€μ™€ λ§ˆμ§€λ§‰ 인덱슀 사이 쀑간 인덱슀의 κ°’κ³Ό 찾고자 ν•˜λŠ” μˆ˜μ™€ 비ꡐ

찾고자 ν•˜λŠ” μˆ˜λ³΄λ‹€ 쀑간값보닀 크면 쀑간값 μ΄ν›„μ˜ κ°’ 확인 

μœ„μ˜ 상황을 반볡. μ€‘κ°„λ²ˆν˜Έ 인덱슀의 값이 찾고자 ν•˜λŠ” μˆ˜μ™€ 같을 λ•ŒκΉŒμ§€. 

 

package μ•Œκ³ λ¦¬μ¦˜;

public class Ex06μ΄μ§„κ²€μƒ‰μ•Œκ³ λ¦¬μ¦˜ {

	public static void main(String[] args) {
		
		//μ΄μ§„κ²€μƒ‰μ•Œκ³ λ¦¬μ¦˜
		//λ³€μˆ˜ 3개λ₯Ό μ‚¬μš©ν•΄μ„œ 데이터λ₯Ό 검색
		//lowIndex, highIndex, middleIndex
		//μž₯점 : μ‹œκ°„λ³΅μž‘λ„κ°€ 1/2둜 λΉ λ₯Έ 탐색 속도λ₯Ό κ°€μ§€κ³  있음!
		//단점 : 검색 μ•Œκ³ λ¦¬μ¦˜ 상 μ •λ ¬λœ λ¦¬μŠ€νŠΈμ—μ„œλ§Œ μ‚¬μš©ν•  수 있음!
		
		int[] arr = {1,7,16,25,30,33,41,66,78,90};
		
		//lowIndex : μ΅œμ†Œ index κ°’
		int lowIndex = 0;
		
		//highIndex : μ΅œλŒ€ index κ°’
		int highIndex = arr.length - 1;

		int num = 78; //찾고자 ν•˜λŠ” 수
		
		while(true) {
			//middleIndex μ΄ˆκΈ°ν™”
			int middleIndex = (lowIndex + highIndex) / 2 ;
			
			if(arr[middleIndex] == num) { //7
				System.out.println("인덱슀 번호 : " + middleIndex);
				break;
			}else {
				if(arr[middleIndex] > num) {
					highIndex = middleIndex - 1;
				}else {
					lowIndex = middleIndex + 1; 
				}
			}
		}
		

	}

}

 

λ°˜μ‘ν˜•