qsort() is een vooraf gedefinieerde standaardfunctie in de C-bibliotheek. We kunnen deze functie gebruiken om een array in oplopende of aflopende volgorde te sorteren. Het maakt intern gebruik van het snelle sorteeralgoritme, vandaar de naam qsort. Het kan een array van elk gegevenstype sorteren, inclusief tekenreeksen en structuren. Het werkt goed en is efficiënt te implementeren. Er is een functie sort() in C++, vergelijkbaar met qsort() in C. In aspecten als looptijd, veiligheid en flexibiliteit overtreft sort() qsort().
Java-logo
In deze tutorial wordt de functie qsort() uitgelegd met voorbeelden. De C-standaard specificeerde de complexiteit van de functie niet, maar aangezien deze intern het snelle sorteeralgoritme volgt, wordt voorlopig aangenomen dat de gemiddelde tijdscomplexiteit O(n*logn) is. De functie wordt gedefinieerd in het stdlib-headerbestand; daarom moeten we het opnemen voordat we het gebruiken.
#include
Syntaxis van de functie:
qsort(array, number, size, function)
reeks : De array die moet worden gesorteerd.
nummer : Aantal elementen in de array die we willen sorteren
maat : Grootte van een afzonderlijk element van de array
functie : Aangepaste vergelijkingsfunctie die we in een gespecificeerd formaat moeten schrijven:
Gespecificeerd formaat van de functie:
int compare( const void* a, const void* b) { }
- qsort() roept de functie Compare() aan voor elke twee elementen in de array.
- Argumenten a en b zijn twee lege verwijzingen naar de twee te vergelijken elementen.
- we moeten de hoofdtekst van Compare() schrijven op de manier waarop deze zou moeten retourneren:
- 0 als twee elementen gelijk zijn
- -1 of een ander negatief geheel getal als het eerste element kleiner is dan het tweede element
- 1 of een ander positief getal als het eerste element groter is dan het tweede.
- De naam van de vergelijkingsfunctie kan van alles zijn, maar de naam moet exact worden opgegeven als argument voor de functie qsort().
- const void* a betekent dat a een void pointer is waarvan de waarde vaststaat. Voordat we het kunnen gebruiken, moeten we een ongeldige verwijzing naar een bepaald gegevenstype typeren.
Nu zullen we de functies verkennen voor het sorteren van arrays van verschillende gegevenstypen.
1. Gehele getallen sorteren:
#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)>
Begrip:
In deze twee regels:
sites zoals bedpage
int a = *(int*) getal1;
int b = *(int*) getal2;
De invoerarray is van het type . Daarom moeten we de lege pointers in integer-pointers typeren voordat we bewerkingen uitvoeren om het vereiste geheugen toe te wijzen. We hebben de waarden waarnaar de twee wijzers verwijzen opgeslagen in twee andere gehele variabelen, a en b. Vervolgens hebben we beide waarden vergeleken met behulp van de vergelijkingsoperatoren.
In plaats van nog twee tijdelijke variabelen te gebruiken, kunnen we een code van één regel schrijven:
int compare(const void* num1, const void* num2) { return *(int*)a - *(int*)b; }
- Als a==b, wordt 0 geretourneerd; als a > b, wordt een positief geheel getal geretourneerd; als een
2. Tekenreeksen sorteren
#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;>
Begrip:
- We hebben een reeks strings. Het verschil tussen een integer-array en een string-array is dat:
- Een integer-array is een verzameling gehele getallen
- Een stringarray is een verzameling karakterarrays/karakteraanwijzers.
- Daarom moeten we in de vergelijkingsfunctie de lege verwijzingen naar (char**)a typeren en niet naar (char*)a.
[[tekenreeks 1], [tekenreeks 2]?]
Wanneer we char* gebruiken, verwijst het naar de array, en om vervolgens naar een string in de array te verwijzen, hebben we een dubbele pointer nodig. - We hebben hier de functie strcmp() gebruikt. De functie wordt gedefinieerd in het headerbestand string.h. We moeten het eerst opnemen.
- 0 als beide strings hetzelfde zijn
- 1 als de ASCII-waarde van een teken in de string groter is dan het overeenkomstige teken in de tweede string
- -1 als de ASCII-waarde van een teken in de string kleiner is dan het corresponderende teken in de tweede string.
3. Een reeks structuren sorteren
#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;>
Begrip:
We hebben een array van het type Structuur gedeclareerd, wat betekent dat elk element in de array een array van structuurelementen is. In het bovenstaande programma heeft de structuur twee gehele elementen. De taak is om de array te sorteren met betrekking tot het eerste structuurelement, en als twee eerste elementen gelijk zijn, moeten we deze sorteren met behulp van het tweede element.
Voorbeeld:
[[1, 2], [3, 4], [1, 4]]
Gesorteerde array: [[1, 2], [1, 4], [3, 4]]
We hebben de functie rand() gebruikt om willekeurige elementen in de array te genereren. In de functie Compare() moeten we de twee verwijzingen naar de typestructuur typeren.
vergelijkbare string
De specialiteit van het gebruik van qsort() is de aangepaste vergelijkingsfunctie die we kunnen ontwerpen zoals wij dat willen. We kunnen ook een paar elementen in een array sorteren en de rest ongesorteerd laten.
5;>