Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

IT Language 연습실

sort( ) 함수 사용해보기 (1) 본문

알고리즘/Sort(정렬)

sort( ) 함수 사용해보기 (1)

akongman 2024. 3. 3. 19:27

버블정렬, 선택정렬, 삽입정렬, 병합정렬, 퀵정렬 들을 알아보았다.

정말 무수히 많은 정렬 알고리즘들이 있다. 후에 알고리즘들을 또 블로그에 기술하겠다.

 

오늘은 좀 하나의 함수를 이용해 정렬을 할 수 있게 도와주는,

표준 라이브러리의 중 <algorithm>에 정의되어 있는 라이브러리 함수 sort 함수를 소개하겠다.

 

해당 함수를 사용하기 위해 위에서 언급한 것처럼 alogrithm 을 include 시켜줘야 한다. 또한 표준 라이브러리에 묶여 있는 것중 std에 namespace 로 묶여 있으니 std:: 를 써주든 using 을 사용해줘야 한다.

#include <iostream>
#include <algorithm>

int main() { 
    int num_array [] {5,19,20,30,20,10};
    
    std::sort(num_array, num_array+6);
    
    for(int i : num_array)
    std::cout<<i<<' ';
}

 

 위 코드 처럼 말이다. 

위 코드를 보면 알 수 있듯 num_array 라는 배열의 총 여섯개의 요소값이 무작위로 들어가 있다.

std::sort(num_array, num_array+6);

 

이 함수 하나로 요소값이 오름차순으로 정렬됐음을 알 수 있다. 굉장히 편리한 함수이다.

sort 함수의 기본 정렬 방식은 오름차순의 정렬임 또한 알 수 있다.

 

sort 함수의 기본 구성은 다음과 같다.

template <typename T>
void sort(T start, T end, Compare);

 

start 와 end에 값에는 배열의 index의 시작값과 배열 index의 종료값+1 을 해주면 된다.

배열 index의 종료값+1 을 해주는 이유는 

배열 요소 값이 총 10개라고 친다면 배열은 0~9까지이다 즉, 배열의 요소값이 더 없는 실질적으로 종료되는 10을 적는것.

 

그렇기 때문에 

std::sort(num_array, num_array+6);

 

위와 같이 적어준 것이다

 

그럼 저기 보이는 compare는 어떠한 것인가? 저것은 함수이다.

위에서도 언급했지만 sort 함수의 정렬은 기본이 오름차순 정렬이기 때문에 이를 내림차순 정렬 해주거나 

정렬 해주는 것에 있어 어떤 조건이나 명시를 줄떄 함수를 쓴다.

 

compare라는 함수가 따로 있는 것이 아니다. 

사용자가 직접 정의하는 함수이기 때문에 함수의 이름이 꼭 compare 가 아니어도 된다.

대신 function( ) 이라고 정의한 함수를 sort에 적을때는 function이라고만 적어주면 되는 것이다.

 

그럼 좀 더 자세하게 compare에 대해서 알아보자.

글쓴이는 함수의 이름을 달리해도 된다는 것을 강조하기 위해 compare라는 이름이 아닌 function이라는 이름으로 정의하곘다. 

#include <iostream>
#include <algorithm>

bool function(int & ref, int & ref2) { 
    return ref > ref2;
}

int main() { 
    int num_array [] {5,19,20,30,20,10};
    
    std::sort(num_array, num_array+6, function);
    
    for(int i : num_array)
    std::cout<<i<<' ';
}

 

위와 같이 사용해줄 수 있다.

이때 반환형이 bool 이며 반환 값으로 ref > ref2 라는 것으로 주고 있다.

ref > ref2 이 값이 참이라면 true 를 반환하고 거짓이라면 false 를 반환하여 1과 0 둘중 하나를 반환한다.

 

그럼 ref 가 ref2 보다 크다라는 의미는 어떠한 의미를 갖고 있을까? 

ref가 ref2보다 크다라는 의미는 좀 쉽게 풀어서 말해 오른쪽에 있는 값보다 큰 순서로 정렬하라.

즉, 내림차순 정렬이라는 얘기이다.

 

ref 가 ref2보다 작다라는 의미는 어떠한 의미를 갖고 있을까?

ref가 ref2보다 작다라는 의미는 오른쪽에 있는 값보다 작은 순서대로 정렬하라는 의미가 된다.

즉, sort의 기본 정렬 오름차순 정렬이라는 얘기이다.

 

------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- -------------

객체를 sort를 이용한 정렬 해보기.

https://blog.naver.com/ndb796/221227975229

 

8. C++ STL sort() 함수 다루기 ①

지난 시간까지 선택 정렬, 버블 정렬, 삽입 정렬, 퀵 정렬, 병합 정렬의 개념에 대해 이해하고 간단한 프로...

blog.naver.com

 강의를 많이 참고해서 공부했다. 좀 더 자세하게 나와있으니 필요하다면 공부하기를 바란다.

 

이를 바탕으로 조금 응용해서 풀어봤다.

#include <iostream>
#include <algorithm>
#include <string>

using namespace std;

template <class T1, class T2>
class A {  
    T1 num;
    T2 name;
    
    public :
    A (T2 str, T1 n) : num(n), name(str) { }
    friend ostream & operator<<(ostream & os , A<int,string> & ref);
    
    bool operator<(A<int,string> & ref) { 
        return num < ref.num;
    }
    
    bool operator>(A<int,string> & ref) { 
        return num > ref.num;
    }
    
};

ostream & operator<<(ostream & os , A<int,string> & ref) { 
    os << ref.name <<endl;
    return os;
}

bool function (A<int,string> & ref, A<int,string> & ref2) { 
    return ref < ref2 ; 
}

bool function2 (A<int,string> & ref, A<int,string> & ref2) { 
    return ref > ref2 ; 
}


int main() { 
    A<int,string>box [] = 
    {
      A<int,string>("Kongman",25),
      A<int,string>("Leesueng",36),
      A<int,string>("Jung",5),
      A<int,string>("Kimhee",15)
    };
    
    sort(box, box+4, function); // 오름차순 
    
    for(int i=0; i<4; i++) { 
        cout<<box[i];
    }
    
    cout<<endl;cout<<endl;
    
    sort(box, box+4, function2);
      for(int i=0; i<4; i++) { 
        cout<<box[i];
    }
    
}

 

여기서 핵심이 되는 곳은 

 

    bool operator>(A<int,string> & ref) { 
        return num > ref.num;
    }
};

bool function (A<int,string> & ref, A<int,string> & ref2) { 
        return ref > ref2 ; 
}

 

바로 이곳이다. 

객체를 점수에 따라 정렬을 함에 있어 연산자 오버로딩을 시키고 연산자 오버로딩을 통해서 

num 과 ref.num 을 비교해서 내림차순으로 정렬을 하겠다는 것.

 

그럼 num을 정렬했으니 이를 따라오는 name도 알아서 정렬이 되어 있다.

------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- -------------

다음 페이지에서는 sort와 pair를 이용한 오름차순 정렬과 내림차순 정렬을 알아보겠다.

'알고리즘 > Sort(정렬)' 카테고리의 다른 글

sort( ) 함수 사용해보기 (2) (pair)  (0) 2024.03.03
정렬(5) 퀵정렬  (0) 2024.03.01
정렬(4) (병합정렬)  (0) 2024.03.01
정렬(3) (삽입정렬)  (0) 2024.02.29
정렬(2) 선택정렬  (0) 2024.02.29