본문 바로가기

프로그래밍/알고리즘

[정렬 알고리즘] 선택정렬 (Selection Sort)

반응형

선택정렬 (Selection Sort)

: 가장 작은 값(또는 가장 큰 값)을 선택하여 배열의 앞쪽에 차례대로 정렬하는 방식 

 

동작방식 

  1. 배열의 첫번째 위치부터 전체 배열까지 가장 작은 값 찾기
  2. 첫번째 위치 값가장 작은 값바꿈 (스와핑
  3. 두번째 위치로 이동하고 같은 과정 반복
  4. 배열의 끝까지 반복 

 

 

시간복잡도

  • 배열이 정렬된 상태든, 정렬되지 않은 상태든, 항상 같은 시간 복잡도 → O(n^2)

 

 

스와핑 (Swapping)

: 두 변수의 값을 교환하는 작업

// 배열로 바꿔야 함
int a = 1;
int b = 3;
int tmp;

tmp = a;
a = b;
b = tmp;

a의 값은  3, b의 값은 1로 교환

 

로또 번호 예제 - 중복 제거 후 정렬 

C언어

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

int main(void) {

	// 로또 번호 추출 
	// 선택정렬 (Selection Sort) 알고리즘

	int lotto[SIZE]; // 로또 배열
	int randNo; // 랜덤번호
	int flag; // 중복 여부 플래그 
	int index = 0; // 로또 인덱스 

	srand((unsigned)time(NULL));

	// 1. 중복 제거 
	for (int i = 0; i < SIZE; ++i) {
		randNo = rand() % 45 + 1;
		flag = 0;

		for (int j = 0; j < index; ++j) {
			// 중복일 경우 
			if (lotto[j] == randNo) {
				flag = 1;
				i--; // 중복일 경우 다시 뽑도록 
				printf("중복입니다. 다시 뽑습니다. \n");
				break;
			}
		}

		// 중복이 아닌 경우
		if (flag == 0) {
			lotto[index] = randNo;
			index++;
		}
	}

	// 1-1. 중복제거 후 로또 번호 출력
	for (int i = 0; i < SIZE; ++i) {
		printf("%d\t", lotto[i]);
	}

	// 2. 정렬 
	int lastIndex = SIZE - 1; // 총 반복횟수 
	int nextIndex; // 다음 인덱스 
	int minIdx; // 최솟값의 인덱스 

	for (int i = 0; i < lastIndex; ++i) {
		nextIndex = i + 1;
		minIdx = i;
		for (int j = nextIndex; j < SIZE; ++j) {
			if (lotto[j] < lotto[minIdx]) {
				minIdx = j; // 최솟값 인덱스 저장
			}
		}
		if (minIdx != i) {
			int tmp = lotto[minIdx];
			lotto[minIdx] = lotto[i];
			lotto[i] = tmp;
		}
	}

	printf("\n");

	// 2-1. 정렬 후 로또 번호 출력
	for (int i = 0; i < SIZE; ++i) {
		printf("%d\t", lotto[i]);
	}

	return 0;
}

 

정렬 시 아래와 같이 순회하며 정렬

반복 횟수 (i) 생성된 randNo lotto 배열 상태 index 값 flag 값 동작
0 12 {} 0 0 12을 lotto[0]에 추가
1 24 {12} 1 0 24를 lotto[1]에 추가
2 36 {12, 24} 2 0 36을 lotto[2]에 추가
3 24 {12, 24, 36} 3 1 중복 발생, i--
3 (반복 재수행) 45 {12, 24, 36} 3 0 45를 lotto[3]에 추가
4 12 {12, 24, 36, 45} 4 1 중복 발생, i--
4 (반복 재수행) 7 {12, 24, 36, 45} 4 0 7을 lotto[4]에 추가
5 19 {12, 24, 36, 45, 7} 5 0 19를 lotto[5]에 추가

 

반응형

'프로그래밍 > 알고리즘' 카테고리의 다른 글

[정렬 알고리즘] 버블정렬 (Bubble Sort)  (1) 2024.11.13