카테고리 없음

삽입 정렬(Insertion Sort)

서원근양학계정 2023. 4. 20. 04:33

삽입 정렬

삽입 정렬(Insertion Sort)은 모든 요소를 이미 정렬된 부분과 비교하여 적절한 위치를 찾아 삽입하는 알고리즘입니다.

두 번째 원소부터 시작해서 앞에 있는 원소와 비교하고 앞에 있는 원소가 값이 더 크다면 뒤로 옮기고 적절한 위치에 원소를 삽입합니다.

두 번째 원소는 첫 번째 원소와 비교되고 세 번째 요소는 두 번째 요소와 첫 번째 요소, 네 번째 요소는 세 번째 요소와 두 번째 요소, 첫 번째 요소 이런 식으로 마지막 요소는 나머지 모든 원소와 비교되고 적절한 위치에 삽입된 뒤 정렬이 완료됩니다.

 

삽입 정렬 예시

 

삽입 정렬 C++ 코드

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>

void Swap(int* a, int* b);

int main()
{
	int number;
	int numbers[1000];

	memset(numbers, 0, sizeof(numbers));

	scanf("%d", &number);

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

	for (int i = 1; i < number; i++)
	{
		for (int j = i - 1; j >= 0; j--)
		{
			if (numbers[j] > numbers[j + 1])
			{
				Swap(&numbers[j], &numbers[j + 1]);
			}
		}
	}

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

void Swap(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

 

정렬하려는 배열이 이미 정렬되어 있는 경우 반복문을 빠져나오도록 해서 알고리즘을 최적화시킬 수 있습니다.

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>

void Swap(int* a, int* b);

int main()
{
	int number;
	int numbers[1000];

	memset(numbers, 0, sizeof(numbers));

	scanf("%d", &number);

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

	int i, j, key;

	for (i = 1; i < number; i++)
	{
		key = numbers[i];

		for (j = i - 1; j >= 0 && numbers[j] > key; j--)
		{
			numbers[j + 1] = numbers[j];
		}

		numbers[j + 1] = key;
	}

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

void Swap(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

 

버블 정렬 시간복잡도

최선 평균 최악
n n2 n2