std :: stable_sort로 해결했습니다
1377번 - 버블 소트
unstable sort랑 sort랑 헷갈려 하시는 거 같아요.
보통 sort라고 하면, 사용자가 정한 rank에 따라서 데이터를 다시 끼워 맞추는 일 정도라고 생각하시면 됩니다.
그렇기 때문에, 보통.. struct가 있는 경우에..
어떻게 정렬시킬거니? 라는 정보를 전달시켜 주는 거고요.
ex. 성적순, 성적이 같다면 이름순으로 정렬하라.
이 때 정렬 기준은 밑줄 친 부분이 되겠네요.
pair 같은 경우, 그 자체로 first끼리 비교한 후, 둘이 같으면 second를 비교하는 비교 함수를 가지고 있다.
여기서 sorting 기준은, first끼리 비교하고, 둘이 같으면 second끼리 비교한다는 겁니다.
즉, first가 작고, first가 같으면 second가 작은 쪽이 앞에 나온다. 라는 기준을 가지고 있어요. 그 기준에 따라서 정렬하는 것 뿐입니다.
stable이냐, unstable이냐가 나오려면..
같은 우선순위를 가지는 데이터가 있을 때, 순서가 바뀌지 않음이 보장되느냐. 그렇지 않은가? 입니다. pair랑은 아무런 관계가 없어요.
pair가 정렬 기준을 2개 두는 것 뿐이고. 애초에 sort()를 부르면 stable한 걸 부르지 않습니다. unstable 합니다.
kwj씨 코드를 봅시다.
struct st{int num,index;};
bool cmp(const st &a,const st&b)
{
return a.num<b.num; //num이 작은 쪽이 앞에 와야 한다.
}
정렬 기준은 num이에요. 제가 밑줄 친 부분이고요. 이 야기는
어떤 원소 A와 B가 있다. A.num과 B.num이 같다면. A와 B의 상대적인 순서가 보장이 안 된다는 소리가 됩니다. unstable 하다면..
사실 정렬 후에 A - B순으로 와도 할 말이 없는 거고, B - A순으로 와도 할 말이 없는 것이지요.
만약에
bool cmp(const st &a,const st&b)
{
if(a.num!=b.num) return a.num<b.num; //num이 다르다면 작은 게 앞에
return a.index<b.index; //num이 같다면 index가 작은 게 앞에.
}
이렇게 바꾸면 어떻게 될까요? 기준이 2개가 생겨버려요. 설령, num이 같다고 해도.
뒤에 오는 index 값에 따라서 상대적인 위치가 결정되어 버립니다. sort에 대한 개념을.. 혼동하고 계신 거 같은데.
차근 차근 잘 정리해 보시면 좋을 거 같습니다. 상당히 어렵지만.. 생각 외로 중요하고. 간과하고 넘어갈 수 없는 주제라.
꼭 짚고 넘어가셨으면 좋겠습니다.
댓글을 작성하려면 로그인해야 합니다.
kwj426 5년 전
pair로 구현한 코드는 문제가 없는데 구조체 변수로 구하면 문제가 생기네요
std::sort 로 정렬해서 unstable sort가 되서 그런것 같은데..
왜 pair로 구현할 때는 되고 구조체 변수로 구할 때는 안되는지 모르겠습니다.
도와주세요 ㅠㅠ