문제 10 · 실습 — 안정 정렬 vs 불안정 정렬
같은 키(점수)를 가진 원소들의 상대 순서가 어떻게 되는지, 안정 정렬stable sort인 std::stable_sort와 불안정 정렬인 선택 정렬selection sort을 비교합니다.
cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
struct Rec { string name; int score; };
// 직접 구현한 선택 정렬 — 대표적인 불안정 정렬
void selectionSort(vector<Rec>& a) {
int n = a.size();
for (int i = 0; i < n; ++i) {
int m = i;
for (int j = i + 1; j < n; ++j)
if (a[j].score < a[m].score) m = j;
swap(a[i], a[m]); // 멀리 있는 원소와 교환 → 같은 키 순서 깨질 수 있음
}
}
int main() {
// 점수가 같은 원소: A·C·F(3점), B·E(1점) — 입력 순서에 주목
vector<Rec> data = {
{"A", 3}, {"B", 1}, {"C", 3}, {"D", 2}, {"E", 1}, {"F", 3}
};
vector<Rec> s1 = data;
stable_sort(s1.begin(), s1.end(),
[](const Rec& x, const Rec& y){ return x.score < y.score; });
vector<Rec> s2 = data;
selectionSort(s2);
cout << "원본 : ";
for (auto& r : data) cout << r.name << r.score << ' ';
cout << '\n';
cout << "stable_sort(안정): ";
for (auto& r : s1) cout << r.name << r.score << ' ';
cout << " <- 3점은 A C F 순서 유지\n";
cout << "선택 정렬(불안정): ";
for (auto& r : s2) cout << r.name << r.score << ' ';
cout << " <- 3점이 C A F 로 뒤바뀜\n";
return 0;
}출력:
원본 : A3 B1 C3 D2 E1 F3
stable_sort(안정): B1 E1 D2 A3 C3 F3 <- 3점은 A C F 순서 유지
선택 정렬(불안정): B1 E1 D2 C3 A3 F3 <- 3점이 C A F 로 뒤바뀜stable_sort는 점수가 같은 A·C·F의 입력 순서를 그대로 보존하지만, 선택 정렬은 먼 원소와 교환하는 과정에서 A와 C의 순서를 뒤바꿉니다. 이것이 안정성의 차이입니다.