C언어 선택정렬 (Selection Sort)
코딩C언어
읽는데 8분 소요
처음 쓰여진 날: 2026-02-10
마지막 수정일: 2026-02-10
조회수: 7
요약
C언어 선택정렬의 원리와 동작 과정을 단계별로 알아봅니다. do-while 이중 루프를 활용한 선택정렬 코드를 분석하고, 정보처리기사 실기에 출제된 선택정렬 문제를 풀어봅니다.
선택정렬 핵심 정리
| 개념 | 설명 | 예시 |
|---|---|---|
| 선택정렬 | 가장 작은(또는 큰) 값을 찾아 앞으로 보내는 정렬 | {64, 25, 12} → {12, 25, 64} |
| 교환 (swap) | 두 변수의 값을 서로 바꾸는 동작 | tmp=a; a=b; b=tmp; |
| 오름차순 | 작은 수부터 큰 수 순서 | 11, 12, 22, 25, 64 |
| 내림차순 | 큰 수부터 작은 수 순서 | 64, 25, 22, 12, 11 |
선택정렬이란?
선택정렬 개념을 몰라도 문제는 풀 수 있습니다
선택정렬(Selection Sort) 은 배열에서 가장 작은 값을 선택하여 앞쪽으로 보내는 정렬 알고리즘입니다.
동작 원리
- 배열의 첫 번째 위치부터 시작합니다.
- 현재 위치의 값과 나머지 값들을 하나씩 비교합니다.
- 현재 위치보다 더 작은 값을 발견하면 교환합니다.
- 다음 위치로 이동하여 같은 과정을 반복합니다.
선택정렬 코드
기본 코드 (for문)
c
코드 하이라이팅 중...
출력: 11 12 22 25 64
| 부분 | 역할 |
|---|---|
for (i = 0; i < n - 1; i++) | 기준 위치를 0부터 n-2까지 이동 |
for (j = i + 1; j < n; j++) | 기준 위치 다음부터 끝까지 비교 |
if (arr[i] > arr[j]) | 앞의 값이 더 크면 교환 (오름차순) |
tmp = arr[i]; ... | 두 값을 교환하는 swap 코드 |

기출문제 코드 (do-while문)
기출문제에서 출제된 선택정렬 코드입니다. 위 for문과 동일한 동작을 do-while 반복문으로 작성한 것입니다.
c
코드 하이라이팅 중...
출력: 11 12 22 25 64
코드 구조 분석
| 부분 | 역할 |
|---|---|
int arr[] = {64, 25, 12, 22, 11} | 정렬할 배열 선언 |
n = sizeof(arr) / sizeof(arr[0]) | 배열 크기 계산 (5) |
바깥쪽 do-while (i) | 기준 위치를 0부터 n-2까지 이동 |
안쪽 do-while (j) | 기준 위치 다음부터 끝까지 비교 |
if (arr[i] > arr[j]) | 앞의 값이 더 크면 교환 (오름차순) |
tmp = arr[i]; ... | 두 값을 교환하는 swap 코드 |
sizeof(arr) / sizeof(arr[0])은 배열 크기를 구하는 공식입니다
sizeof(arr)는 배열 전체 크기(바이트), sizeof(arr[0])는 요소 하나의 크기(바이트)입니다. 나누면 요소 개수가 됩니다. int가 4바이트일 때, 5개 요소면 20 / 4 = 5입니다.
정렬 과정 따라가기
c
코드 하이라이팅 중...
이 배열을 오름차순으로 정렬하는 과정을 단계별로 따라갑니다.
i = 0: arr[0]과 나머지 비교
arr[0] = 64를 arr[1] ~ arr[4]와 차례로 비교합니다.
| 비교 | arr[i] > arr[j]? | 동작 | 배열 상태 |
|---|---|---|---|
| arr[0]=64 vs arr[1]=25 | 64 > 25 참 | 교환 | {25, 64, 12, 22, 11} |
| arr[0]=25 vs arr[2]=12 | 25 > 12 참 | 교환 | {12, 64, 25, 22, 11} |
| arr[0]=12 vs arr[3]=22 | 12 > 22 거짓 | 유지 | {12, 64, 25, 22, 11} |
| arr[0]=12 vs arr[4]=11 | 12 > 11 참 | 교환 | {11, 64, 25, 22, 12} |
i = 0이 끝나면 arr[0]에 가장 작은 값 11이 위치합니다.
i = 1: arr[1]과 나머지 비교
| 비교 | arr[i] > arr[j]? | 동작 | 배열 상태 |
|---|---|---|---|
| arr[1]=64 vs arr[2]=25 | 참 | 교환 | {11, 25, 64, 22, 12} |
| arr[1]=25 vs arr[3]=22 | 참 | 교환 | {11, 22, 64, 25, 12} |
| arr[1]=22 vs arr[4]=12 | 참 | 교환 | {11, 12, 64, 25, 22} |
i = 1이 끝나면 arr[1]에 두 번째로 작은 값 12가 위치합니다.
i = 2: arr[2]와 나머지 비교
| 비교 | arr[i] > arr[j]? | 동작 | 배열 상태 |
|---|---|---|---|
| arr[2]=64 vs arr[3]=25 | 참 | 교환 | {11, 12, 25, 64, 22} |
| arr[2]=25 vs arr[4]=22 | 참 | 교환 | {11, 12, 22, 64, 25} |
i = 3: arr[3]과 나머지 비교
| 비교 | arr[i] > arr[j]? | 동작 | 배열 상태 |
|---|---|---|---|
| arr[3]=64 vs arr[4]=25 | 참 | 교환 | {11, 12, 22, 25, 64} |

최종 결과
text
코드 하이라이팅 중...
출력: 11 12 22 25 64
교환 (swap) 코드
두 변수의 값을 바꾸려면 임시 변수(tmp) 가 필요합니다.
c
코드 하이라이팅 중...
| 단계 | tmp | arr[i] | arr[j] |
|---|---|---|---|
| 교환 전 | - | 64 | 25 |
1. tmp = arr[i] | 64 | 64 | 25 |
2. arr[i] = arr[j] | 64 | 25 | 25 |
3. arr[j] = tmp | 64 | 25 | 64 |
왜 임시 변수가 필요한가요?
임시 변수 없이 arr[i] = arr[j]를 먼저 하면 arr[i]의 원래 값이 사라집니다. tmp에 미리 저장해야 나중에 arr[j]에 넣을 수 있습니다.
오름차순 vs 내림차순
비교 연산자 방향만 바꾸면 정렬 순서가 달라집니다.
| 정렬 순서 | 조건 | 의미 | 결과 |
|---|---|---|---|
| 오름차순 | arr[i] > arr[j] | 앞이 더 크면 교환 | 작은 값이 앞으로 |
| 내림차순 | arr[i] < arr[j] | 앞이 더 작으면 교환 | 큰 값이 앞으로 |
기출문제에서 부등호 방향을 묻습니다
실행 결과가 오름차순(작은 수 → 큰 수)이면 >, 내림차순(큰 수 → 작은 수)이면 <를 넣어야 합니다. 출력 결과를 먼저 확인하세요.
do-while 반복문
이 문제의 선택정렬 코드는 for문이나 while문 대신 do-while문을 사용합니다.
do-while문의 구조
c
코드 하이라이팅 중...
| 구분 | while문 | do-while문 |
|---|---|---|
| 조건 검사 시점 | 먼저 검사 후 실행 | 먼저 실행 후 검사 |
| 최소 실행 횟수 | 0회 (조건이 거짓이면 실행 안 함) | 1회 (무조건 한 번은 실행) |
c
코드 하이라이팅 중...
선택정렬에서의 do-while
c
코드 하이라이팅 중...
이 코드를 for문으로 바꾸면 아래와 같습니다.
c
코드 하이라이팅 중...
실기 문제 풀이 전략
문제 유형
| 유형 | 설명 | 핵심 |
|---|---|---|
| 빈칸 채우기 | 비교 연산자(> 또는 <) 채우기 | 출력 결과가 오름/내림차순인지 확인 |
| 출력값 묻기 | 정렬 후 배열 출력 결과 | 정렬 과정을 단계별로 추적 |
풀이 순서
- 출력 결과 확인: 오름차순인지 내림차순인지 파악
- 비교 연산자 결정: 오름차순이면
>, 내림차순이면< - 정렬 과정 추적: 필요하면 배열 상태를 단계별로 기록