반응형
나이순 정렬 문제다.
정렬 후에도, 값이 같은 원소의 전후관계가 바뀌지 않는 정렬 알고리즘을 안정 정렬(stable sort)이라고 한다.
안정정렬에 해당하는 병합정렬을 직접 구현해 풀었다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
int age;
char name[101];
} person;
person *x;
void __merge_sort(person a[], int left, int right ){
if(left < right) { // 요소 2개 이상일 경우
int i;
int j = 0;
int p = 0;
int k = left;
int center = ( left + right ) /2;
__merge_sort(a, left, center);
__merge_sort(a, center+1, right);
for(i = left; i <= center; i++) {
x[p].age = a[i].age;
strcpy(x[p].name, a[i].name);
p++;
}
while(i <= right && j < p) {
if(x[j].age <= a[i].age) {
a[k].age = x[j].age;
strcpy(a[k].name, x[j].name);
k++; j++;
} else {
a[k].age = a[i].age;
strcpy(a[k].name, a[i].name);
k++; i++;
}
}
while(j < p) {
a[k].age = x[j].age;
strcpy(a[k].name, x[j].name);
k++; j++; // 여기서 k++ 하나 빼먹어서 시간 많이 씀 ㅜ
}
}
}
void merge_sort(person a[], int n) {
x = calloc(n, sizeof(person));
__merge_sort(a, 0, n - 1);
}
int main() {
person *p;
int nx;
scanf("%d", &nx);
p = calloc(nx, sizeof(person));
for(int i = 0; i <nx; i++) {
scanf("%d %s", &p[i].age, p[i].name);
}
merge_sort(p, nx);
for(int i = 0; i <nx; i++) {
printf("%d %s\n", p[i].age, p[i].name);
}
}
병합정렬을 직접구현해서 코드는 좀 길다.
반응형
'[백준]' 카테고리의 다른 글
[BaekJoon/백준] 15650번 (0) | 2020.12.05 |
---|---|
[BaekJoon/백준] 15649번 (0) | 2020.12.05 |
[BaekJoon/백준] 1181번 & 나중에 다시보기 (1) | 2020.12.03 |
[BaekJoon/백준] 11651번 (0) | 2020.12.01 |
[BaekJoon/백준] 11650번 & 나중에 다시보기 (0) | 2020.12.01 |