qsort()는 C 라이브러리에 미리 정의된 표준 함수입니다. 이 함수를 사용하여 배열을 오름차순 또는 내림차순으로 정렬할 수 있습니다. 내부적으로 빠른 정렬 알고리즘을 사용하므로 이름이 qsort입니다. 문자열과 구조를 포함한 모든 데이터 유형의 배열을 정렬할 수 있습니다. 잘 작동하고 구현하는 것이 효율적입니다. C의 qsort()와 비슷한 C++의 sort() 함수가 있습니다. 실행 시간, 안전성, 유연성과 같은 측면에서 sort()는 qsort()보다 뛰어납니다.
이 튜토리얼에서는 예제와 함께 qsort() 함수를 설명합니다. C 표준에서는 함수의 복잡도를 명시하지 않았지만 내부적으로는 퀵 정렬 알고리즘을 따르기 때문에 평균 시간 복잡도는 잠정적으로 O(n*logn)로 간주됩니다. 이 함수는 stdlib 헤더 파일에 정의되어 있습니다. 그러므로 우리는 그것을 사용하기 전에 그것을 포함시켜야 합니다.
#include
함수 구문:
qsort(array, number, size, function)
정렬 : 정렬할 배열입니다.
문자열을 int로 변환하는 변환기
숫자 : 정렬하려는 배열의 요소 수
크기 : 배열의 개별 요소 크기
기능 : 지정된 형식으로 작성해야 하는 사용자 정의 비교 함수:
함수의 지정된 형식:
int compare( const void* a, const void* b) { }
- qsort()는 배열의 두 요소마다 Compare() 함수를 호출합니다.
- 인수 a와 b는 비교할 두 요소를 가리키는 두 개의 void 포인터입니다.
- 우리는 반환되어야 하는 방식으로 Compare()의 본문을 작성해야 합니다.
- 두 요소가 동일한 경우 0
- 첫 번째 요소가 두 번째 요소보다 작은 경우 -1 또는 기타 음의 정수
- 첫 번째 요소가 두 번째 요소보다 큰 경우 1 또는 다른 양수입니다.
- 비교 함수의 이름은 무엇이든 가능하지만 이름은 qsort() 함수에 대한 인수로 정확하게 제공되어야 합니다.
- const void* a는 a가 값이 고정된 void 포인터임을 의미합니다. 사용하기 전에 일부 데이터 유형에 대한 void 포인터를 타입캐스트해야 합니다.
이제 다양한 데이터 유형의 배열을 정렬하는 기능을 살펴보겠습니다.
1. 정수 정렬:
#include #include int compare(const void* num1, const void* num2) // comparing function { int a = *(int*) num1; int b = *(int*) num2; if(a > b) { return 1; } else if(a <b) { return -1; } 0; int main() arr[50], n, i; printf('enter the size of array to be sorted: '); scanf('%d', &n); printf(' enter elements into array: for(i="0;" i < n; i++) &arr[i]); qsort(arr, sizeof(int), compare); printf(' the sorted printf(' ['); if(i="=" n-1) prevent a comma(,) after last element printf('%d', arr[i]); break; printf('%d, ', printf(']'); pre> <p> <strong>Output:</strong> </p> <pre> Enter the size of the array to be sorted: 5 Enter elements into the array: 98 34 89 0 2 The sorted array: [0, 2, 34, 89, 98] </pre> <h3>Understanding:</h3> <p>In these two lines:</p> <p> <strong>int a = *(int*) num1;</strong> </p> <p> <strong>int b = *(int*) num2;</strong> </p> <p>The input array is of type . Hence, we must typecast the void pointers into integer pointers before performing any operations to allocate the required memory. We stored the values the two pointers are pointing at in two other integer variables, a and b. Then, we compared both values using the comparison operators.</p> <p>Instead of using two more temporary variables, we can write a one-line code:</p> <pre> int compare(const void* num1, const void* num2) { return *(int*)a - *(int*)b; } </pre> <ul> <li>If a==b, 0 is returned; if a > b, a positive integer is returned; if a <b, a negative integer is returned.< li> </b,></li></ul> <h3>2. Sorting strings</h3> <pre> #include #include #include int compare(const void* num1, const void* num2) { //char **a = (char**)num1; //char **b = (char**)num2; //return strcmp(*a, *b); return strcmp(*(char**)num1, *(char**)num2); } int main() { int n, i; char* arr[50]; printf('Enter the size of the array to be sorted: '); scanf('%d', &n); printf(' Enter elements into the array: '); for(i = 0; i <n; i++) { arr[i]="malloc(100*" sizeof(char)); scanf('%s', arr[i]); } qsort(arr, n, sizeof(char*), compare); printf(' the sorted array: '); printf(' ['); for(i="0;" i < n; if(i="=" n-1) printf('%s', break; printf('%s, ', printf(']'); pre> <p> <strong>Output:</strong> </p> <pre> Enter the size of the array to be sorted: 5 Enter elements into the array: hi hello how are you The sorted array: [are, hello, hi, how, you] </pre> <h3>Understanding:</h3> <ul> <li>We have an array of strings. The difference between an integer array and a string array is that: <ol class="points"> <li>An integer array is a collection of integers</li> <li>A string array is a collection of character arrays/character pointers.</li> </ol></li> <li>Hence, in the compare function, we need to typecast the void pointers to (char**)a and not (char*)a. <br> <strong>[[string 1], [string 2]?]</strong> <br> When we use char*, it points to the array, and then, to point to a string in the array, we need a double pointer.</li> <li>We used the strcmp() function here. The function is defined in the string.h header file. We need to include it first.</li> <tr><td>The function returns</td> : <ol class="points"> <li>0 if both strings are the same</li> <li>1 if the ASCII value of a character in the string is greater than the corresponding character in the second string</li> <li>-1 if the ASCII value of a character in the string is less than the corresponding character in the second string.</li> </ol> </tr></ul> <h3>3. Sorting an Array of Structure</h3> <pre> #include #include struct Structure { int num1; int num2; }s; typedef struct Structure data; int compare(const void* p, const void* q) { data *a = (data *)p; data *b = (data *)q; int first = (a -> num1)- (b -> num1); int second = (a -> num2)- (b -> num2); if(first == 0) { return second; } return first; } int main() { data array[5]; int i = 0; printf('Original array: '); printf('[['); for(i = 0; i <5; i++) { array[i].num1="rand()%10;" array[i].num2="rand()%10;" if(i="=" 4) printf('%d, %d]]', array[i].num1, array[i].num2); break; } %d], [', qsort(array, 5, sizeof(s), compare); printf(' sorted array: '); printf('[['); for(i="0;" i < 5; pre> <p> <strong>Output:</strong> </p> <pre> Original array: [[1, 7], [4, 0], [9, 4], [8, 8], [2, 4]] Sorted array: [[1, 7], [2, 4], [4, 0], [8, 8], [9, 4]] </pre> <h3>Understanding:</h3> <p>We declared an array of type Structure, meaning every element in the array is an array of structure elements. In the above program, the structure has two integer elements. The task is to sort the array with respect to the first Structure element, and if any two first elements are equal, we need to sort it using the second element.</p> <p> <strong>Example:</strong> </p> <p>[[1, 2], [3, 4], [1, 4]]</p> <p>Sorted array: [[1, 2], [1, 4], [3, 4]]</p> <p>We used the rand() function to generate random elements in the array. In the compare() function, we need to typecast the two pointers to type structure.</p> <img src="//techcodeview.com/img/c-tutorial/30/qsort-c.webp" alt="qsort() in C"> <p>The specialty of using qsort() is the custom compare function that we can design the way we want. We can also sort a few elements in an array and leave the rest unsorted.</p> <hr></5;></pre></n;></pre></b)>
이해:
이 두 줄에서:
C 프로그램
int a = *(int*) num1;
int b = *(int*) num2;
입력 배열은 유형입니다. 따라서 필요한 메모리를 할당하기 위한 작업을 수행하기 전에 void 포인터를 정수 포인터로 타입캐스트해야 합니다. 두 포인터가 가리키는 값을 두 개의 다른 정수 변수 a와 b에 저장했습니다. 그런 다음 비교 연산자를 사용하여 두 값을 모두 비교했습니다.
두 개의 임시 변수를 더 사용하는 대신 한 줄 코드를 작성할 수 있습니다.
int compare(const void* num1, const void* num2) { return *(int*)a - *(int*)b; }
- a==b이면 0이 반환됩니다. a > b이면 양의 정수가 반환됩니다. 만약
2. 문자열 정렬
#include #include #include int compare(const void* num1, const void* num2) { //char **a = (char**)num1; //char **b = (char**)num2; //return strcmp(*a, *b); return strcmp(*(char**)num1, *(char**)num2); } int main() { int n, i; char* arr[50]; printf('Enter the size of the array to be sorted: '); scanf('%d', &n); printf(' Enter elements into the array: '); for(i = 0; i <n; i++) { arr[i]="malloc(100*" sizeof(char)); scanf(\'%s\', arr[i]); } qsort(arr, n, sizeof(char*), compare); printf(\' the sorted array: \'); printf(\' [\'); for(i="0;" i < n; if(i="=" n-1) printf(\'%s\', break; printf(\'%s, \', printf(\']\'); pre> <p> <strong>Output:</strong> </p> <pre> Enter the size of the array to be sorted: 5 Enter elements into the array: hi hello how are you The sorted array: [are, hello, hi, how, you] </pre> <h3>Understanding:</h3> <ul> <li>We have an array of strings. The difference between an integer array and a string array is that: <ol class="points"> <li>An integer array is a collection of integers</li> <li>A string array is a collection of character arrays/character pointers.</li> </ol></li> <li>Hence, in the compare function, we need to typecast the void pointers to (char**)a and not (char*)a. <br> <strong>[[string 1], [string 2]?]</strong> <br> When we use char*, it points to the array, and then, to point to a string in the array, we need a double pointer.</li> <li>We used the strcmp() function here. The function is defined in the string.h header file. We need to include it first.</li> <tr><td>The function returns</td> : <ol class="points"> <li>0 if both strings are the same</li> <li>1 if the ASCII value of a character in the string is greater than the corresponding character in the second string</li> <li>-1 if the ASCII value of a character in the string is less than the corresponding character in the second string.</li> </ol> </tr></ul> <h3>3. Sorting an Array of Structure</h3> <pre> #include #include struct Structure { int num1; int num2; }s; typedef struct Structure data; int compare(const void* p, const void* q) { data *a = (data *)p; data *b = (data *)q; int first = (a -> num1)- (b -> num1); int second = (a -> num2)- (b -> num2); if(first == 0) { return second; } return first; } int main() { data array[5]; int i = 0; printf('Original array: '); printf('[['); for(i = 0; i <5; i++) { array[i].num1="rand()%10;" array[i].num2="rand()%10;" if(i="=" 4) printf(\'%d, %d]]\', array[i].num1, array[i].num2); break; } %d], [\', qsort(array, 5, sizeof(s), compare); printf(\' sorted array: \'); printf(\'[[\'); for(i="0;" i < 5; pre> <p> <strong>Output:</strong> </p> <pre> Original array: [[1, 7], [4, 0], [9, 4], [8, 8], [2, 4]] Sorted array: [[1, 7], [2, 4], [4, 0], [8, 8], [9, 4]] </pre> <h3>Understanding:</h3> <p>We declared an array of type Structure, meaning every element in the array is an array of structure elements. In the above program, the structure has two integer elements. The task is to sort the array with respect to the first Structure element, and if any two first elements are equal, we need to sort it using the second element.</p> <p> <strong>Example:</strong> </p> <p>[[1, 2], [3, 4], [1, 4]]</p> <p>Sorted array: [[1, 2], [1, 4], [3, 4]]</p> <p>We used the rand() function to generate random elements in the array. In the compare() function, we need to typecast the two pointers to type structure.</p> <img src="//techcodeview.com/img/c-tutorial/30/qsort-c.webp" alt="qsort() in C"> <p>The specialty of using qsort() is the custom compare function that we can design the way we want. We can also sort a few elements in an array and leave the rest unsorted.</p> <hr></5;></pre></n;>
이해:
- 문자열 배열이 있습니다. 정수 배열과 문자열 배열의 차이점은 다음과 같습니다.
- 정수 배열은 정수의 모음입니다.
- 문자열 배열은 문자 배열/문자 포인터의 모음입니다.
- 따라서 비교 함수에서 void 포인터를 (char*)a가 아닌 (char**)a로 형변환해야 합니다.
[[문자열 1], [문자열 2]?]
char*를 사용하면 배열을 가리키고, 배열의 문자열을 가리키려면 이중 포인터가 필요합니다. - 여기서는 strcmp() 함수를 사용했습니다. 이 함수는 string.h 헤더 파일에 정의되어 있습니다. 먼저 이를 포함해야 합니다.
- 두 문자열이 모두 같으면 0
- 문자열에 있는 문자의 ASCII 값이 두 번째 문자열에 있는 해당 문자보다 큰 경우 1
- 문자열에 있는 문자의 ASCII 값이 두 번째 문자열에 있는 해당 문자보다 작은 경우 -1입니다.
3. 구조 배열 정렬
#include #include struct Structure { int num1; int num2; }s; typedef struct Structure data; int compare(const void* p, const void* q) { data *a = (data *)p; data *b = (data *)q; int first = (a -> num1)- (b -> num1); int second = (a -> num2)- (b -> num2); if(first == 0) { return second; } return first; } int main() { data array[5]; int i = 0; printf('Original array: '); printf('[['); for(i = 0; i <5; i++) { array[i].num1="rand()%10;" array[i].num2="rand()%10;" if(i="=" 4) printf(\'%d, %d]]\', array[i].num1, array[i].num2); break; } %d], [\', qsort(array, 5, sizeof(s), compare); printf(\' sorted array: \'); printf(\'[[\'); for(i="0;" i < 5; pre> <p> <strong>Output:</strong> </p> <pre> Original array: [[1, 7], [4, 0], [9, 4], [8, 8], [2, 4]] Sorted array: [[1, 7], [2, 4], [4, 0], [8, 8], [9, 4]] </pre> <h3>Understanding:</h3> <p>We declared an array of type Structure, meaning every element in the array is an array of structure elements. In the above program, the structure has two integer elements. The task is to sort the array with respect to the first Structure element, and if any two first elements are equal, we need to sort it using the second element.</p> <p> <strong>Example:</strong> </p> <p>[[1, 2], [3, 4], [1, 4]]</p> <p>Sorted array: [[1, 2], [1, 4], [3, 4]]</p> <p>We used the rand() function to generate random elements in the array. In the compare() function, we need to typecast the two pointers to type structure.</p> <img src="//techcodeview.com/img/c-tutorial/30/qsort-c.webp" alt="qsort() in C"> <p>The specialty of using qsort() is the custom compare function that we can design the way we want. We can also sort a few elements in an array and leave the rest unsorted.</p> <hr></5;>
이해:
우리는 Structure 유형의 배열을 선언했습니다. 이는 배열의 모든 요소가 구조 요소의 배열임을 의미합니다. 위 프로그램에서 구조에는 두 개의 정수 요소가 있습니다. 작업은 첫 번째 Structure 요소를 기준으로 배열을 정렬하는 것입니다. 두 개의 첫 번째 요소가 동일한 경우 두 번째 요소를 사용하여 정렬해야 합니다.
예:
[[1, 2], [3, 4], [1, 4]]
정렬된 배열: [[1, 2], [1, 4], [3, 4]]
우리는 rand() 함수를 사용하여 배열에서 임의의 요소를 생성했습니다. Compare() 함수에서는 유형 구조에 대한 두 포인터를 유형 변환해야 합니다.
마우스 스크롤이 작동하지 않습니다
qsort() 사용의 특징은 원하는 방식으로 디자인할 수 있는 사용자 정의 비교 기능입니다. 배열의 몇 가지 요소를 정렬하고 나머지는 정렬되지 않은 상태로 둘 수도 있습니다.
5;>