1. qsort 함수를 사용해 정렬하기
qsort 함수
- c언어의 표준 라이브러리에서 제공
- 배열뿐만 아니라 구조체형 배열 등 모든 자료형의 배열에 적용 가능
- qsort(배열의 첫번째 요소에 대한 포인터, 요소의 개수, 요소의 크기, 비교함수에 대한 포인터)
- 비교함수
- 첫 번째 인수가 가리키는 값이 더 작은 경우 음숫값(-1) 반환
- 첫 번째 인수가 가리키는 값과 두 번째 인수가 가리키는 값이 같은 경우 0을 반환
- 첫 번째 인수가 가리키는 값이 더 큰 경우 양숫값(1) 반환
- qsort 함수를 사용하여 정렬하는 프로그램
//qsort함수를 사용하여 정수 배열을 오름차순으로 정렬
#include <stdio.h>
#include <stdlib.h>
//int형 비교함수 (오름차순 정렬에 사용)
int int_cmp(const int *a, const int *b)
{
if(*a<*b)
return -1;
else if(*a>*b)
return 1;
else
return 0;
}
int main()
{
int nx;
printf("qsort에 의한 정렬\n");
printf("요소 개수:");
scanf("%d",&nx);
int *x = (int*)calloc(nx, sizeof(int)); //요소의 개수가 nx인 int형 배열 x를 생성
for(int i=0; i<nx; i++) {
printf("x[%d]:",i);
scanf("%d",&x[i]);
}
qsort(x, //배열
nx, //요소의 개수
sizeof(int), //요소의 크기
(int(*)(const void *, const void*))int_cmp //비교함수
);
puts("오름차순으로 정렬했습니다.");
for(int i=0; i <nx; i++)
printf("x[%d]=%d\n",i,x[i]);
free(x); //배열 x를 해제
return 0;
}
2. qsort를 이용하여 구조체 배열 정렬하기
- 정렬하려는 데이터는 name(이름), height(키), weight(몸무게)의 멤버로 구성된 구조체 Person의 배열 x
- 배열 x를 이름,키,몸무게를 기준으로 3회 정렬
1) 이름 오름 차순 정렬용 비교함수 -> npcmp 함수
2) 키 오름차순 정렬용 비교함수 -> hpcmp 함수
3) 몸무게 내림차순 정렬용 비교함수 -> wpcmp 함수
//qsort함수를 사용하여 구조체 배열을 정렬
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char name[10]; //이름
int height; //키
int weight; //몸무게
}Person;
//Person형 비교함수 (이름 오름차순)
int npcmp(const Person *x, const Person *y)
{
return strcmp(x->name,y->name);
}
//Person형 비교함수 (키 오름차순)
int hpcmp (const Person *x, const Person *y)
{
return x->height < y->height ? -1:
x->height > y->height ? 1:0;
}
//Person형 비교함수 (몸무게 내림차순)
int wpcmp(const Person *x, const Person *y)
{
return x->weight < y->weight ? 1:
x->weight > y->weight ? -1:0;
}
//사람 no명의 데이터를 출력
void print_person(const Person x[], int no)
{
for(int i=0; i < no; i++)
printf("%-10s %dcm %dkg\n",x[i].name, x[i].height, x[i].weight);
}
int main()
{
Person x[] = {
{"sunmi",170,52},
{"yoobin",180,70},
{"sohee",172,63},
{"jina",165,50}
};
int nx = sizeof(x)/sizeof(int); //배열 x의 요소 개수
puts("정렬전");
print_person(x,nx);
//이름 오름차순으로 정렬
qsort(x,nx,sizeof(Person),(int(*)(const void *,const void *))npcmp);
puts("\n이름 오름차순으로 정렬 후");
print_person(x,nx);
//키 오름차순으로 정렬
qsort(x,nx,sizeof(Person),(int(*)(const void *,const void *))hpcmp);
puts("\n키 오름차순으로 정렬 후");
print_person(x,nx);
//몸무게 내림차순으로 정렬
qsort(x,nx,sizeof(Person),(int(*)(const void *,const void *))wpcmp);
puts("\n 몸무게 내림차순으로 정렬 후 ");
print_person(x,nx);
return 0;
}
'C언어 > 자료구조' 카테고리의 다른 글
6-8장 힙 정렬 (0) | 2023.08.01 |
---|---|
6-7장 병합 정렬 (0) | 2023.07.31 |
6-6장 퀵 정렬 (2) (0) | 2023.07.31 |
6-6장 퀵 정렬(1) (0) | 2023.07.31 |
6-5장 쉘 정렬 (0) | 2023.07.31 |