[C언어 소스] 순차 정렬(Sequential Sort) 알고리즘 시뮬레이션 구현하기

이번 강의에서는 순차 정렬(Sequential Sort) 알고리즘을 수행했을 때 어떻게 진행하는지 시각화하여 인지할 수 있게 코드를 구현해 볼게요.
순차 정렬 실행 화면
순차 정렬 실행 화면
순차 정렬 알고리즘은 이미 소개를 하였기에 설명은 생략할게요.
//https://ehpub.co.kr
//[언제나 C언어] 순차 정렬(Sequential Sort) [예제 Center]
#pragma warning(disable:4996)
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#define LENGTH(arr)  (sizeof(arr)/sizeof(arr[0]))
#define SWAP(i, j) {int t; t=i; i=j; j=t;}

void ViewArr(int *base, int n, const char *msg)
{
	int i = 0;
	for (i = 0; i < n; i++)
	{
		printf("%2d ", base[i]);
	}
	puts(msg);
}
void SequenceSort(int *base, int n)
{
	int i, j;
	for (i = 0; i < n; i++)
	{
		for (j = i + 1; j < n; j++)
		{
			if (base[i] > base[j])
			{
				SWAP(base[i], base[j]);
			}
		}
	}
}

int main(void)
{
	int arr[10] = { 9,4,3,0,5,8,7,6,2,1 };
	ViewArr(arr, LENGTH(arr), "before");
	getch();
	SequenceSort(arr, LENGTH(arr));	
	ViewArr(arr, LENGTH(arr), "after");
	system("pause");
	return 0;
}


시뮬레이션으로 진행 과정을 보여주기 위해 콘솔의 텍스트의 색을 변경하는 부분을 먼저 구현합니다. 이 부분은 Windows API에서 제공하는 기능을 이용합니다. SetConsoleTextAttribute(콘솔 핸들, 색상)을 전달하면 콘솔 화면에 색을 변경할 수 있어요. 출력할 콘솔은 표준 출력입니다. GetStdHandle(STD_OUTPUT_HANDLE)을 호출하면 표준 출력의 핸들을 얻어올 수 있어요. 콘솔의 텍스트 색상은 16가지 색을 사용하여 0~15 사이의 정수를 전달합니다. 이 부분은 열거형으로 정의할게요.
#include <widnows.h>

enum Color
{
	LACK, BLUE, GREEN, JADE, RED, PURPLE, YELLOW, WHITE, GRAY,
	LIGHT_BLUE, LIGHT_GREEN, LIGHT_JADE, LIGHT_RED, LIGHT_PURPLE, LIGHT_YELLOW, LIGHT_WHITE
};

void changecolor(int color)
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
}
이제 배열의 원소를 출력하는 함수를 작성합시다. 여기에서는 이미 정렬을 완료한 부분, 인덱스 i, i~j, j, j 뒷 부분으로 나누어 색을 다루게 표시하게 구현할게요. 그리고 SWAP 정보를 출력할 것인지 여부(int r)도  인자로 전달하여 표시할게요.
void ViewArr2(int *base, int i,int j, int n, int r)
{
	int s = 0;
	for (s = 0; s < n; s++)
	{
		if (s < i)
		{
			changecolor(PURPLE);
		}
		else if (s == i)
		{
			changecolor(RED);
		}
		else if (s < j)
		{
			changecolor(WHITE);
		}
		else if (s == j)
		{
			changecolor(GREEN);
		}
		else
		{
			changecolor(WHITE);
		}
		printf("%2d ", base[s]);
	}
	changecolor(WHITE);
	if (r)
	{
		printf("SWAP %d %d", base[i], base[j]);
	}
	printf("\n");	
}
이제 시뮬레이션에 맞게 SequenceSort2 함수를 정의합시다. SWAP하기 전에 배열 정보를 ViewArr2를 이용하여 출력합니다. 그리고 내부 for문을 수행할 때마다 배열 정보를 ViewArr2를 이용하여 출력합니다. 시뮬레이션이므로 Sleep을 통해 잠시 멈추게 합니다. Sleep 함수는 1/1000초 단위로 전달합니다.
void SequenceSort2(int *base, int n)
{
	int i, j;
	for (i = 0; i < n; i++)
	{
		for (j = i + 1; j < n; j++)
		{
			if (base[i] > base[j])
			{
				ViewArr2(base, i, j, n, 1);
				SWAP(base[i], base[j]);
			}
			ViewArr2(base, i, j, n, 0);
			Sleep(1000);
		}
	}
}
다음은 완성한 소스 코드입니다.
//https://ehpub.co.kr
//[언제나 C언어] 순차 정렬(Sequential Sort) [예제 Center]
#pragma warning(disable:4996)
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#define LENGTH(arr)  (sizeof(arr)/sizeof(arr[0]))
#define SWAP(i, j) {int t; t=i; i=j; j=t;}

#include //Sleep
enum Color
{
	LACK, BLUE, GREEN, JADE, RED, PURPLE, YELLOW, WHITE, GRAY,
	LIGHT_BLUE, LIGHT_GREEN, LIGHT_JADE, LIGHT_RED, LIGHT_PURPLE, LIGHT_YELLOW, LIGHT_WHITE
};
void changecolor(int color)
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
}

void ViewArr2(int *base, int i,int j, int n, int r)
{
	int s = 0;
	for (s = 0; s < n; s++)
	{
		if (s < i)
		{
			changecolor(PURPLE);
		}
		else if (s == i)
		{
			changecolor(RED);
		}
		else if (s < j)
		{
			changecolor(WHITE);
		}
		else if (s == j)
		{
			changecolor(GREEN);
		}
		else
		{
			changecolor(WHITE);
		}
		printf("%2d ", base[s]);
	}
	changecolor(WHITE);
	if (r)
	{
		printf(" SWAP %d %d", base[i], base[j]);
	}
	printf("\n");	
}

void SequenceSort2(int *base, int n)
{
	int i, j;
	for (i = 0; i < n; i++)
	{
		for (j = i + 1; j < n; j++)
		{
			if (base[i] > base[j])
			{
				ViewArr2(base, i, j, n, 1);
				SWAP(base[i], base[j]);
			}
			ViewArr2(base, i, j, n, 0);
			Sleep(1000);
		}
	}
}
void ViewArr(int *base, int n, const char *msg)
{
	int i = 0;
	for (i = 0; i < n; i++)
	{
		printf("%2d ", base[i]);
	}
	puts(msg);
}
void SequenceSort(int *base, int n)
{
	int i, j;
	for (i = 0; i < n; i++)
	{
		for (j = i + 1; j < n; j++)
		{
			if (base[i] > base[j])
			{
				SWAP(base[i], base[j]);
			}
		}
	}
}

int main(void)
{
	int arr[10] = { 9,4,3,0,5,8,7,6,2,1 };
	ViewArr(arr, LENGTH(arr), "before");
	getch();
	SequenceSort2(arr, LENGTH(arr));
	ViewArr(arr, LENGTH(arr), "after");
	system("pause");
	return 0;
}