ν‹°μŠ€ν† λ¦¬ λ·°

μš°μ„ μˆœμœ„ 큐λ₯Ό μ΄μš©ν•œ μ •λ ¬

: 비ꡐ κ°€λŠ₯ν•œ μ›μ†Œ 집합을 μ •λ ¬ν•˜λŠ”λ° μš°μ„ μˆœμœ„ 큐 이용 κ°€λŠ₯

 

 

1. 선택 μ •λ ¬

- μš°μ„ μˆœμœ„ 큐λ₯Ό 무순리슀트둜 κ΅¬ν˜„ (μš°μ„ μˆœμœ„ 큐의 ν•­λͺ©λ“€μ„ λ¦¬μŠ€νŠΈμ— μž„μ˜ μˆœμ„œλ‘œ μ €μž₯)

- μ‹€ν–‰μ‹œκ°„ : O(n^2) (μš°μ„ μˆœμœ„ 큐에 μ‚½μž…ν•˜λŠ”λ° O(n)μ‹œκ°„ μ†Œμš” + μ •λ ¬μˆœμ„œλ‘œ μ‚­μ œν•˜λŠ”λ° n+(n-1)+(N-2)+... μ‹œκ°„ μ†Œμš”)

 

2. μ‚½μž… μ •λ ¬

- μš°μ„ μˆœμœ„ 큐λ₯Ό μˆœμ„œλ¦¬μŠ€νŠΈλ‘œ κ΅¬ν˜„ (μš°μ„ μˆœμœ„ 큐의 ν•­λͺ©λ“€μ„ λ¦¬μŠ€νŠΈμ— ν‚€ μ •λ ¬ μˆœμ„œλ‘œ μ €μž₯)

- μ‹€ν–‰μ‹œκ°„ : O(n^2) (μš°μ„ μˆœμœ„ 큐에 μ‚½μž…ν•˜λŠ”λ° n+(n-1)+(N-2)+... μ‹œκ°„ μ†Œμš” + μ •λ ¬μˆœμ„œλ‘œ μ‚­μ œν•˜λŠ”λ° O(n)μ‹œκ°„ μ†Œμš”)

 

3. 제자리 μ •λ ¬

-리슀트 자체λ₯Ό μœ„ν•œ 곡간 이외에 O(1) 곡간 λ§Œμ„ μ‚¬μš©ν•œλ‹€λ©΄, 이λ₯Ό "제자리(in-place)"μ—μ„œ μˆ˜ν–‰ν•œλ‹€κ³  말함

nν•˜κ³  μƒκ΄€μ—†λŠ” μƒμˆ˜ 곡간이냐 vs n에 따라 λ‹¬λΌμ§€λŠ” 곡간이냐

 

 

제자리 선택 μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜

 

문제: n개의 μ–‘μ˜ μ •μˆ˜(쀑볡 κ°€λŠ₯)λ₯Ό μž…λ ₯λ°›μ•„, 선택 정렬을 μ΄μš©ν•˜μ—¬ μ •λ ¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±

1. 크기 n인 λ°°μ—΄ 동적할당

2. μž…λ ₯ κ°’ μ €μž₯을 μœ„ν•œ λ°°μ—΄ 이외에 O(1)의 μΆ”κ°€ κ³΅κ°„λ§Œ μ‚¬μš©

3. λ°°μ—΄μ˜ λ’· 뢀뢄을 μ •λ ¬ μƒνƒœλ‘œ μœ μ§€, 맀 λ°˜λ³΅λ§ˆλ‹€ μ΅œλŒ€ ν•œ 번의 κ΅ν™˜ μ—°μ‚°λ§Œ μ‚¬μš©

μž…λ ₯ μ˜ˆμ‹œ 1
8 β†¦ n
8 31 48 73 3 65 20 29

좜λ ₯ μ˜ˆμ‹œ 1
β–‘3 8 20 29 31 48 65 73 β†¦ μ •λ ¬ κ²°κ³Ό


μž…λ ₯ μ˜ˆμ‹œ 2좜λ ₯ μ˜ˆμ‹œ 2
8 β†¦ n
73 65 48 31 29 20 8 3

좜λ ₯ μ˜ˆμ‹œ 2
β–‘3 8 20 29 31 48 65 73 β†¦ μ •λ ¬ κ²°κ³Ό

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

void inPlaceSelectionSort(int *A, int n) {// 제자리 선택 μ •λ ¬
	int j, max, tmp = 0;

	for (int i = n-1; i >= 1; i--) {
		max = i;
		for (j = i - 1; j >= 0; j--) {
			if (A[j] > A[max]) {
				max = j;
			}
		}
		tmp = A[i];
		A[i] = A[max];
		A[max] = tmp;
	}
}

int main() {
	int n;
	int* A;

	scanf("%d", &n);

	A = (int*)malloc(sizeof(int) * n);
	if (A == NULL) {
		printf("Not enough memory!");
		return -1;
	}

	for (int i = 0; i < n; i++) {
		scanf("%d", &A[i]);
		getchar();
	}

	inPlaceSelectionSort(A, n);

	for (int i = 0; i < n; i++) {
		printf(" %d", A[i]);
	}
	free(A);

	return 0;
}

 

 

제자리 μ‚½μž… μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜

 

문제: n개의 μ–‘μ˜ μ •μˆ˜(쀑볡 κ°€λŠ₯)λ₯Ό μž…λ ₯λ°›μ•„, 선택 정렬을 μ΄μš©ν•˜μ—¬ μ •λ ¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±

1. 크기 n인 λ°°μ—΄ 동적할당

2. μž…λ ₯ κ°’ μ €μž₯을 μœ„ν•œ λ°°μ—΄ 이외에 O(1)의 μΆ”κ°€ κ³΅κ°„λ§Œ μ‚¬μš©

3. λ°°μ—΄μ˜ μ•ž 뢀뢄을 μ •λ ¬ μƒνƒœλ‘œ μœ μ§€, 맀 λ°˜λ³΅λ§ˆλ‹€ μ΅œλŒ€ ν•œ 번의 κ΅ν™˜ μ—°μ‚°λ§Œ μ‚¬μš©

μž…λ ₯ μ˜ˆμ‹œ 1
7 β†¦ n
3 73 48 31 8 11 20

좜λ ₯ μ˜ˆμ‹œ 1
β–‘3 8 11 20 31 48 73 β†¦ μ •λ ¬ κ²°κ³Ό


μž…λ ₯ μ˜ˆμ‹œ 2
8 β†¦ n
73 65 48 31 29 20 8 3

좜λ ₯ μ˜ˆμ‹œ 2
β–‘3 8 20 29 31 48 65 73 ↦ μ •λ ¬ κ²°κ³Ό

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

void inPlaceInsertionSort(int *A, int n) {
	int j, save, tmp = 0;

	for (int i = 1; i <= n-1; i++) {
		save = A[i];
		j = i - 1;
		while ((j >= 0) && (A[j] > save)) {
			A[j + 1] = A[j];
			j -= 1;
		}
		A[j + 1] = save;
	}
}

int main() {
	int n;
	int* A;

	scanf("%d", &n);

	A = (int*)malloc(sizeof(int) * n);
	if (A == NULL) {
		printf("Not enough memory!");
		return -1;
	}

	for (int i = 0; i < n; i++) {
		scanf("%d", &A[i]);
		getchar();
	}

	inPlaceInsertionSort(A, n);

	for (int i = 0; i < n; i++) {
		printf(" %d", A[i]);
	}
	free(A);

	return 0;
}
λ°˜μ‘ν˜•