q
qsortqsort는 사용자가 제공한 비교 함수에 따라 임의의 오브젝트 배열에 대해 다형 정렬 알고리즘을 구현하는 C 표준 라이브러리 함수입니다.C 표준에서는 QuickSort를 구현할 필요가 없지만 원래 Unix C 라이브러리에서 구현하기 위해 사용되었던 "quicker sort" 알고리즘(R. S. Scowen에 의한 Quicksort [1]변형)에서 이름이 붙여졌습니다.
qsort 함수의 실장은 3방향 비교 함수에 대한 함수 포인터 및 개별 입력 객체의 크기를 지정하는 파라미터를 취함으로써 다양한 종류의 데이터를 정렬하는 기능인 다형성을 실현한다.C 표준에서는 입력 [2]배열 내의 항목에 대한 전체 순서를 구현하기 위해 비교 기능이 필요합니다.
역사
Qsort 함수는 1972년에 [3][1]Lee McMahon에 의해 구현되었습니다.버전 3 Unix에서는 라이브러리 함수로 사용되었지만, 그 후에는 어셈블러 [3]서브루틴이었습니다.
버전 6 Unix [4]에는 표준 C 버전의 대략적인 인터페이스를 갖춘 C 버전이 배치되어 있습니다.1983년에 [1]BSD를 위해 다시 쓰여졌다.이 함수는 ANSI C(1989)에서 표준화되었습니다.
1991년 Bell Labs 직원들은 McMahon과 BSD 버전의 qsort가 일부 단순한 입력에 2차 시간을 소비한다는 것을 관찰했다.따라서 Jon Bentley와 Douglas McIlroy는 보다 빠르고 견고한 새로운 구현을 [1]개발했습니다.
예
다음 C 코드 조각은 qsort를 사용하여 정수 목록을 정렬하는 방법을 보여 줍니다.
#실패하다 <stdlib.h> /* 비교 기능.비교 대상 항목에 대한 두 개의 일반(void) 포인터를 수신합니다.*/ 인트 비교_ints(컨스턴트 무효 *p, 컨스턴트 무효 *q) { 인트 x = *(컨스턴트 인트 *)p; 인트 y = *(컨스턴트 인트 *)q; /* 정의되지 않은 동작을 일으킬 수 있는 x - y 반환을 피합니다. 부호 있는 정수 오버플로가 원인입니다.*/ 한다면 (x < > y) 돌아가다 -1; // 오름차순을 원할 경우 -1, 내림차순을 원할 경우 -1을 반환합니다. 또 다른 한다면 (x > y) 돌아가다 1; // 오름차순을 원할 경우 1을 반환하고 내림차순을 원할 경우 -1을 반환합니다. 돌아가다 0; // 모든 로직이 대체적으로 작성되는 경우가 많습니다. 돌아가다 (x > y) - (x < > y); } /* n개의 정수 배열을 a로 나타냅니다.* / 무효 정렬_ints(인트 *a, size_t n) { q(a, n, 크기(*a), 비교_ints); }
내선번호
원본의 비교 기능이 있기 때문에qsort
는 두 개의 포인터만 허용하며, 추가 매개 변수를 전달(예: 두 값의 차이로 다른 값과 비교하는 비교 함수 생성)해야 합니다.이 문제는 BSD 및 GNU Unix 유사 시스템에 의해 다음과 같이 해결되었습니다.qsort_r
function : 추가 파라미터를 비교함수에 전달할 수 있습니다.의 두 가지 버전qsort_r
논거가 다르다C11 Annex K는 다음을 정의합니다.qsort_s
기본적으로 GNU와 동일qsort_r
macOS와 FreeBSD libcs에는 다음도 포함됩니다.qsort_b
폐쇄와 유사한 블록(blocks)을 동일한 [5]문제에 대한 대체 해결책으로 사용하는 변종입니다.
레퍼런스
- ^ a b c d Bentley, Jon L.; McIlroy, M. Douglas (1993). "Engineering a sort function". Software: Practice and Experience. 23 (11): 1249–1265. CiteSeerX 10.1.1.14.8162. doi:10.1002/spe.4380231105.
- ^ ISO/IEC 9899:201x, Programming Languages:C(초안).§ 7.22.5. 2010년 11월 16일.
- ^ a b "qsort(III), from UNIX Programmer's Manual, Third Edition". Unix Archive.
- ^ "qsort(III), from UNIX Programmer's Manual, Sixth Edition". Unix Archive.
- ^ FreeBSD 라이브러리 기능 매뉴얼 –