본문 바로가기
Programming/Tips(C++,C#)

Algorithm : Sorting

by 곰네Zip 2011. 10. 11.


참고자료
c++.com : http://cplusplus.com/reference/
일반적프로그래밍과 STL책.

저도 잘 모르는 내용이지만 제 임의대로 제가 기억하려고 올리는 것이므로 태클 환영합니다.

Merge : 두개의 구간을 하나의 정렬된 구간으로 합침. 오름차순으로 정렬함 만약 구간1과 구간2의 값이 같다면, 구간1의 값이 앞에 배치됨. Set_union과 비슷하다. 그러나 set_union은 중복을 제거하고, merge는 제거하지 않음.

template <class InputIterator1, class InputIterator2, class OutputIterator>

  OutputIterator merge ( InputIterator1 first1, InputIterator1 last1,

                         InputIterator2 first2, InputIterator2 last2,

                         OutputIterator result )

{

  while (true) {

    *result++ = (*first2<*first1)? *first2++ : *first1++;

    if (first1==last1) return copy(first2,last2,result);

    if (first2==last2) return copy(first1,last1,result);

  }

}

 

Inplace_merge : 연속된 두 구간이 정렬되어있을 때, 그 둘을 하나의 정렬된 구간으로 만든다. 우선 하나로 합친 뒤, 정렬을 수행함. Compare comp optional.

template <class BidirectionalIterator, class Compare>

  void inplace_merge ( BidirectionalIterator first, BidirectionalIterator middle,

                       BidirectionalIterator last, Compare comp );

 

 Includes : 정렬된 구간으로 표현되는 두 집합에 대해 한 집합이 다른 집합의 부분집합인지 리턴해줌. (comp optional)

template <class InputIterator1, class InputIterator2>

  bool includes ( InputIterator1 first1, InputIterator1 last1,

                  InputIterator2 first2, InputIterator2 last2 , Compare comp)

{

  while (first1!=last1)

  {

    if (*first2<*first1) break;

    else if (*first1<*first2) ++first1;

    else { ++first1; ++first2; }

    if (first2==last2) return true;

  }

  return false;

}

 

 

Set_union : 두 집합의 합집합을 만듦

template <class InputIterator1, class InputIterator2, class OutputIterator>

  OutputIterator set_union ( InputIterator1 first1, InputIterator1 last1,

                             InputIterator2 first2, InputIterator2 last2,

                             OutputIterator result )

{

  while (true)

  {

    if (first1==last1) return copy(first2,last2,result);

    if (first2==last2) return copy(first1,last1,result);

 

    if (*first1<*first2) *result++ = *first1++;

    else if (*first2<*first1) *result++ = *first2++;

    else { *result++ = *first1++; first2++; }

  }

}

 

Set_intersection : 두 집합의 교집합을 만듦. 교집합은 정렬된 구간임.

template <class InputIterator1, class InputIterator2, class OutputIterator>

  OutputIterator set_intersection ( InputIterator1 first1, InputIterator1 last1,

                                    InputIterator2 first2, InputIterator2 last2,

                                    OutputIterator result )

{

  while (first1!=last1 && first2!=last2)

  {

    if (*first1<*first2) ++first1;

    else if (*first2<*first1) ++first2;

    else { *result++ = *first1++; first2++; }

  }

  return result;

}

 

반응형

댓글