이번 강의에서는 순차 정렬(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 사이의 정수를 전달합니다. 이 부분은 열거형으로 정의할게요.
이제 배열의 원소를 출력하는 함수를 작성합시다. 여기에서는 이미 정렬을 완료한 부분, 인덱스 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;
}