티스토리 뷰
C언어 qsort() 함수
C언어에서는 Quick sort를 손쉽게 사용할 수 있도록 라이브러리가 구현되어 있습니다.
함수의 프로토타입은 다음과 같습니다.
void qsort (void *base, size_t nel, size_t width, int (*compare)(const void *, const void *)
- 함수명 : qsort
- 필요헤더 : stdlib.h
- 리턴타입 : void
- 파라미터 :
- 정렬 할 배열
- 배열의 총 엘리먼트 개수
- 배열 한 개의 크기
- 비교를 수행할 함수의 포인터
- 리턴값 : 없음
- 함수역할 : 퀵 소트(Quick sort)를 이용하여 배열을 정렬한다.
헤더파일 stdlib.h가 미리 선언되 있어야 하구요. 참고로 void * 라는 것은 어떠한 타입이든 상관없이 포인터를 받을 수 있다는 의미입니다. 즉, int 형 포인터이거나 char형 포인터이거나 구분않고 사용할 수 있습니다.
파라미터의 각 의미는 위의 설명을 참조하시면 되구요. 마지막 compare라는 함수 포인터에 대하여 값을 비교하는 함수 하나를 만들어 주어야 합니다. 이 함수가 반환되는 값에 따라 오름차순의 정렬 방법을 사용할 것인가, 내림차순의 정렬 방법을 사용할 것인가도 결정할 수 있습니다.
함수포인터에 관한 포스팅을 보고 싶으시면 이곳을 클릭 하세요
이 compare함수는 문자열비교함수인 strcmp와 같은 모양을 띄고 있습니다. 따라서 문자열의 배열이라면, strcmpy 함수를 그대로 넣어 사용할 수도 있습니다. 오름차순으로 정렬하고 싶을 때, compare함수의 첫 번째 파라미터가 더 클 때 양수를 반환, 첫 번째 파라미터가 더 작을 때 음수를 반환, 같을 때 0을 반환하게 만들면 됩니다. (내림차순일때는 반대로)
다음의 예제를 한 번 보시겠습니다.
#include <stdio.h>
#include <stdlib.h>
// 오름차순
int compare (void *first, void *second)
{
if (*(int*)first > *(int*)second)
return 1;
else if (*(int*)first < *(int*)second)
return -1;
else
return 0;
}
int main(int argc, char** argv)
{
int arr[] = {4,3,1,7,5,9,8,2,6};
int arr_size = sizeof(arr) / sizeof(int);
int i;
// before sort
for (i = 0; i < arr_size; i++)
printf("%d ", arr[i]);
printf("\n");
// apply quick sort
qsort(arr, arr_size, sizeof(int), compare);
// after sort
for (i = 0; i < arr_size; i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
실생활에서 가장 빠르다고 여겨지는 Quick sort, 구현이 다소 어렵다는 단점이 있지만 이미 만들어진 라이브러리를 사용함으로써 쉽게 이용할 수 있게 됩니다. 앞으로는 bubble sort를 만들어서 정렬하는 것 보다 qsort 라이브러리를 써서 정렬해보는 것이 어떨까요? ^^
'C, C++ > C, C++' 카테고리의 다른 글
C언어 가변인자(가변파라미터)를 사용해보자 (7) | 2014.01.25 |
---|---|
c/c++ sprintf, snprintf 함수 (13) | 2014.01.21 |
배열의 개수를 세는 _countof 매크로 (0) | 2013.12.31 |
c언어 - 함수포인터 (Function pointer) (32) | 2013.12.30 |
c언어 함수에 대한 기본 (2) (0) | 2013.06.14 |
- Total
- Today
- Yesterday
- 스위프트
- vim
- ansi color
- 우분투 16.04
- 폰트 조정
- Swift
- 안시 색상
- 안시 컬러
- terminal 색
- C언어
- 챗봇
- 리눅스 터미널 색상
- Rx.js
- git proxy
- zone
- observable
- itoa
- Zone.js
- JavaScript
- typeScript
- angular2
- qemu linux arm
- QT
- ECMA2015
- Angular
- NgZone
- git 설정
- lua table
- 타입스크립트
- ZONES
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |