<ALGORITHM>/NOTE

210118(월)

CodeGrimie 2021. 1. 18. 19:19

순차 정렬(Sequntial Sort)

한 자리씩 순차적으로 정렬한다고 해서 순차 정렬.

내부 순환문이 한번 다 돌면 그 자리는 최솟값이 확정되고 다음 자리로 넘어간다.

 

개념

for (i = 0 > n-1)
    for (j = i+1 > n)
        if (Compare(arr[i], arr[j]) > 0)
            Swap(arr[i], arr[j]);

 

코드

#include <cstdio>

int  Compare(int lhs, int rhs);
void Swap(int* lhs, int* rhs);

int main()
{
    const int arrMax = 5;
    int iArr[5] = { 0,3,4,2,1 };

    printf("> BEFORE\n");
    for (int i = 0; i < arrMax; i++)
    {
        printf("iArr[%d] = %d\n", i, iArr[i]);
    }
    printf("\n");

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

    printf("> AFTER\n");
    for (int i = 0; i < arrMax; i++)
    {
        printf("iArr[%d] = %d\n", i, iArr[i]);
    }

    return (0);
}

int  Compare(int lhs, int rhs)
{
    return (lhs - rhs);
}

void Swap(int* lhs, int* rhs)
{
    int _temp = *lhs;
    *lhs = *rhs;
    *rhs = _temp;
}

가장 흥미로웠던 점은 Compare() 함수의 개념이었다.

 

비교하는 함수야 금방 떠올릴 수 있었지만 return (lhs > rhs)가 아니라

return (lhs - rhs)도 가능하다는 것을 새삼 깨달았다.

 

bool에 비해서 ( -, 0, + )로 대소유무 뿐 아니라 동일 여부도 구분할 수 있기 때문에 더 쓰임새가 많다.

(역시 좋은 코드를 봐야 한다.)

거품 정렬(Bubble Sort)

▼ 개념

for (i = n > 1)
    for (j = 1 < i)
        if (Compare(arr[j-1], arr[j]) > 0)
            Swap(arr[j-1], arr[j]);

 

코드

#include <cstdio>

int	 Compare(int lhs, int rhs);
void Swap(int* lhs, int* rhs);

int main()
{
    const int arrMax = 10;
    int iArr[arrMax] = { 9,3,4,2,1,0,8,7,6,5};

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

#if 1
    // 교수님이 알려주신 방법
    // 오름차순
    for (int i = arrMax; i > 1; i--)
    {
        for (int j = 1; j < i; j++)
        {
            if (Compare(iArr[j - 1], iArr[j]) > 0)
            {
                Swap(&iArr[j - 1], &iArr[j]);
            }

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

#else
    // 거꾸로도 될 꺼 같아서 해본 방법..
    // 내림차순
    for (int i = 0; i < arrMax; i++)
    {
        for (int j = 0; j < arrMax - i - 1; j++)
        {
            if (Compare(iArr[j], iArr[j + 1]) > 0)
            {
                Swap(&iArr[j], &iArr[j + 1]);
            }

            printf("{ ");
            for (int i = 0; i < arrMax; i++)
            {
                printf("%d ", iArr[i]);
            }
            printf("}\n");
        }
    }
#endif

    return (0);
}

int	 Compare(int lhs, int rhs)
{
    return (lhs - rhs);
}

void Swap(int* lhs, int* rhs)
{
    int _temp = *lhs;
    *lhs = *rhs;
    *rhs = _temp;
}

앞의 순차 정렬을 하고 난 다음에 바로 거품 정렬에 들어가서 그렇게 어려운 부분은 없었다.

 

구현하고 나서 시간이 좀 남아서 반대로도 되지 않을까 생각해서 추가 코드를 작성했다.

교수님이 알려주신 방법은 왼쪽<-오른쪽으로 진행하는 방법이었으니

for문을 뒤집어서 왼쪽->오른쪽으로 진행하게 해 보았다.