q

qsort

qsort는 사용자가 제공한 비교 함수에 따라 임의의 오브젝트 배열에 대해 다형 정렬 알고리즘구현하는 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_rfunction : 추가 파라미터를 비교함수에 전달할 수 있습니다.의 두 가지 버전qsort_r논거가 다르다C11 Annex K는 다음을 정의합니다.qsort_s기본적으로 GNU와 동일qsort_rmacOS와 FreeBSD libcs에는 다음도 포함됩니다.qsort_b폐쇄와 유사한 블록(blocks)을 동일[5]문제에 대한 대체 해결책으로 사용하는 변종입니다.

레퍼런스

  1. ^ 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.
  2. ^ ISO/IEC 9899:201x, Programming Languages:C(초안).§ 7.22.5. 2010년 11월 16일.
  3. ^ a b "qsort(III), from UNIX Programmer's Manual, Third Edition". Unix Archive.
  4. ^ "qsort(III), from UNIX Programmer's Manual, Sixth Edition". Unix Archive.
  5. ^ qsort_r(3)FreeBSD 라이브러리 기능 매뉴얼