알고리즘

삽입 정렬 (Insertion Sort)

갠소롱 2024. 7. 10. 02:01

삽입 정렬 삽입 정렬은 리스트를 순회하면서 각 원소를 적절한 위치에 삽입하여 정렬된 부분 리스트를 점진적으로 확장하는 방식으로 작동합니다.

 - 시간 복잡도

        Best   : O(n)

        Worst : O(n^2) 

 - 삽입 정렬은 추가적인 메모리를 거의 사용하지 않기 때문에 제자리 정렬(In Place Sort, O(1)의 공간 복잡도)입니다.

 - 삽입 정렬은 입력 순서를 보장하는 안정 정렬(Stable Sort)입니다.

 

오름차순 예시

 

struct Num
{
	int idx;
	int num;

	Num(int idx, int num)
		: idx(idx), num(num) {};
};

void AscendingInsertionSort(vector<Num>& arr)
{
	for (int i = 1; i < arr.size(); ++i)
	{
		Num key = arr[i];

		int j;
		for (j = i - 1; j >= 0; --j)
		{
			if (arr[j].num > key.num)
			{
				arr[j + 1] = arr[j];
			}
			else
				break;
		}

		arr[j + 1] = key;
	}
}

void DscendingInsertionSort(vector<Num>& arr)
{
	for (int i = 1; i < arr.size(); ++i)
	{
		Num key = arr[i];

		int j;
		for (j = i - 1; j >= 0; --j)
		{
			if (arr[j].num < key.num)
			{
				arr[j + 1] = arr[j];
			}
			else
				break;
		}

		arr[j + 1] = key;
	}
}

int main(void)
{
	srand(static_cast<unsigned int>(time(NULL)));
	vector<Num> v1;
	vector<Num> v2;
	for (int i = 0; i < 10; ++i)
	{
		v1.push_back(Num(i, rand() % 6));
		v2.push_back(Num(i, rand() % 6));
	}

	cout << "오름차순 정렬 전 : ";
	PrintVector(v1);
	AscendingInsertionSort(v1);
	cout << "오름차순 정렬 후 : ";
	PrintVector(v1);
	cout << "정렬 후 idx \t : ";
	printVectorIdx(v1);
	
	cout << endl;

	cout << "내림차순 정렬 전 : ";
	PrintVector(v2);
	DscendingInsertionSort(v2);
	cout << "내림차순 정렬 후 : ";
	PrintVector(v2);
	cout << "정렬 후 idx \t : ";
	printVectorIdx(v2);

	return 0;
}

 

결과