본문 바로가기

C언어/자료구조

6-6 퀵 정렬(3)

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