<ALGORITHM>/SUMMARIZE

0. 교환함수(Swap)

CodeGrimie 2021. 1. 17. 01:24

포인터 방식

C99

▼ 관련 개념

Pointer & Call By Address

 

▼ 구현 코드

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

▼ 사용 예시

Swap(&lhs, &rhs);

포인터(*)를 이용한 방법이다.

포인터는 C 표준에서는 함수 인자에 직접적으로 접근할 수 있는 유일한 방법이다.

CPP B.11

▼ 관련 개념

Reference & Call By Reference

 

▼ 구현 코드

void Swap(int& lhs, int& rhs)
{
    int temp = lhs;
    lhs = rhs;
    rhs = lhs;
}

▼ 사용 예시

Swap(lhs, rhs);

참조자(&)를 이용한 방법이다.

CPP에서 추가된 참조자를 사용한 방법으로 기존 C의 방법에 비해 사용할 때 편리성이 개선되었다.

CPP A.11

▼ 관련 개념

Template & Call By Reference

 

▼ 구현 코드

template<typename T>
void Swap(T& lhs, T& rhs)
{
    int temp = lhs;
    lhs = rhs;
    rhs = lhs;
}

▼ 사용 예시

Swap(lhs, rhs);

주형(Template)을 이용한 방법이다.

CPP 11에서 추가된 기능인 주형을 이용한 방법으로 기존 CPP의 방법에 비해 변수형에 관계없이 동일한 기능을 하기 때문에 편리성이 크게 개선되었다.

XOR 방식

C99 & CPP B.11 & CPP A.11

▼ 관련 개념

Pointer & Call By Address & Call By Reference & XOR

 

▼ 구현 코드

// C99
void Swap(int* lhs, int* rhs)
{
    if (lhs != rhs)
    {
        *lhs ^= *rhs;
        *rhs ^= *lhs;
        *lhs ^= *rhs;
    }
}

// CPP B.11
void Swap(int& lhs, int& rhs)
{
    if (&lhs != &rhs)
    {
        lhs ^= rhs;
        rhs ^= lhs;
        lhs ^= rhs;
    }
}

// CPP A.11
template<typename T>
void Swap(T& lhs, T& rhs)
{
    if (&lhs != &rhs)
    {
        lhs ^= rhs;
        rhs ^= lhs;
        lhs ^= rhs;
    }
}

▼ 사용 예시

// C99
Swap(&lhs, &rhs);

// CPP B.11 & A.11
Swap(lhs, rhs);

XOR(^)를 이용한 방법이다.

데이터 의존성이 큰 방법이기 때문에 현세대의 컴파일러에서는 좀 더 느리다.

인라인 함수를 지원하는 컴파일러라면 프로그래머가 코드 최적화를 통해 비슷한 속도까지 낼 수는 있다.

그리고 필요한 메모리와 캐시가 줄기 때문에 임베디드 쪽에서는 아직도 종종 사용되는 방법이다.

 

XOR 연산을 이용해서 Swap 함수를 구현할 수 있다는 걸 발상한 선배 프로그래머들이 대단할 뿐이다.