logo

qsort() u C-u

qsort() je unaprijed definirana standardna funkcija u C biblioteci. Ovu funkciju možemo koristiti za sortiranje niza uzlaznim ili silaznim redoslijedom. Interno koristi algoritam brzog sortiranja, otuda i naziv qsort. Može sortirati niz bilo koje vrste podataka, uključujući nizove i strukture. Djeluje dobro i učinkovito ga je implementirati. Postoji funkcija sort() u C++-u slična qsort() u C-u. U aspektima kao što su vrijeme rada, sigurnost i fleksibilnost, sort() nadmašuje qsort().

Ovaj vodič objašnjava funkciju qsort() s primjerima. C standard nije odredio složenost funkcije, ali kako interno slijedi algoritam brzog sortiranja, njezina prosječna vremenska složenost uvjetno je O(n*logn). Funkcija je definirana u datoteci zaglavlja stdlib; stoga ga moramo uključiti prije upotrebe.

 #include 

Sintaksa funkcije:

 qsort(array, number, size, function) 

niz : niz koji se sortira.

broj : Broj elemenata u nizu koje želimo sortirati

što znači google

veličina : Veličina pojedinog elementa niza

funkcija : Prilagođena funkcija usporedbe koju trebamo napisati u određenom formatu:

izvršiti ljusku skripte

Navedeni format funkcije:

 int compare( const void* a, const void* b) { } 
  • qsort() poziva funkciju compare() za svaka dva elementa u nizu.
  • Argumenti a i b su dva void pointera koji pokazuju na dva elementa koja se uspoređuju.
  • moramo napisati tijelo compare() na način na koji treba vratiti:
    1. 0 ako su dva elementa jednaka
    2. -1 ili bilo koji drugi negativni cijeli broj ako je prvi element manji od drugog elementa
    3. 1 ili bilo koji drugi pozitivan broj ako je prvi element veći od drugog.
  • Naziv funkcije za usporedbu može biti bilo koji, ali naziv mora biti točno naveden kao argument funkciji qsort().
  • const void* a znači a je void pokazivač čija je vrijednost fiksna. Prije korištenja, moramo tipizirati void pokazivač na neki tip podataka.

Sada ćemo istražiti funkcije za sortiranje nizova različitih tipova podataka.

1. Sortiranje cijelih brojeva:

 #include #include int compare(const void* num1, const void* num2) // comparing function { int a = *(int*) num1; int b = *(int*) num2; if(a &gt; 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 &gt; 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(&apos;Enter the size of the array to be sorted: &apos;); scanf(&apos;%d&apos;, &amp;n); printf(&apos;
Enter elements into the array: &apos;); 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 -&gt; num1)- (b -&gt; num1); int second = (a -&gt; num2)- (b -&gt; num2); if(first == 0) { return second; } return first; } int main() { data array[5]; int i = 0; printf(&apos;Original array: 
&apos;); printf(&apos;[[&apos;); 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)>

Razumijevanje:

U ova dva retka:

int a = *(int*) num1;

reactjs karta

int b = *(int*) num2;

Ulazni niz je tipa . Dakle, moramo tipizirati void pointere u cjelobrojne pokazivače prije izvođenja bilo kakvih operacija za dodjelu potrebne memorije. Pohranili smo vrijednosti na koje dva pokazivača pokazuju u dvije druge cjelobrojne varijable, a i b. Zatim smo usporedili obje vrijednosti koristeći operatore usporedbe.

Umjesto da koristimo još dvije privremene varijable, možemo napisati kod u jednom retku:

 int compare(const void* num1, const void* num2) { return *(int*)a - *(int*)b; } 
  • Ako je a==b, vraća se 0; ako je a > b, vraća se pozitivan cijeli broj; ako a

2. Razvrstavanje nizova

 #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(&apos;Enter the size of the array to be sorted: &apos;); scanf(&apos;%d&apos;, &amp;n); printf(&apos;
Enter elements into the array: &apos;); 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 -&gt; num1)- (b -&gt; num1); int second = (a -&gt; num2)- (b -&gt; num2); if(first == 0) { return second; } return first; } int main() { data array[5]; int i = 0; printf(&apos;Original array: 
&apos;); printf(&apos;[[&apos;); 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;>

Razumijevanje:

  • Imamo niz nizova. Razlika između niza cijelih brojeva i niza nizova je u sljedećem:
    1. Niz cijelih brojeva je skup cijelih brojeva
    2. Niz znakova je zbirka nizova znakova/pokazivača na znakove.
  • Stoga, u funkciji usporedbe, moramo tipizirati void pokazivače na (char**)a, a ne (char*)a.
    [[niz 1], [niz 2]?]
    Kada koristimo char*, on pokazuje na niz, a zatim, da bismo pokazali na niz u nizu, potreban nam je dvostruki pokazivač.
  • Ovdje smo koristili funkciju strcmp(). Funkcija je definirana u datoteci zaglavlja string.h. Prvo ga moramo uključiti.
  • Funkcija se vraća:
    1. 0 ako su oba niza ista
    2. 1 ako je ASCII vrijednost znaka u nizu veća od odgovarajućeg znaka u drugom nizu
    3. -1 ako je ASCII vrijednost znaka u nizu manja od odgovarajućeg znaka u drugom nizu.

3. Sortiranje niza strukture

 #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 -&gt; num1)- (b -&gt; num1); int second = (a -&gt; num2)- (b -&gt; num2); if(first == 0) { return second; } return first; } int main() { data array[5]; int i = 0; printf(&apos;Original array: 
&apos;); printf(&apos;[[&apos;); 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;>

Razumijevanje:

Deklarirali smo polje tipa Structure, što znači da je svaki element u nizu niz strukturnih elemenata. U gornjem programu struktura ima dva cjelobrojna elementa. Zadatak je sortirati niz s obzirom na prvi element Strukture, a ako su bilo koja dva prva elementa jednaka, trebamo ga sortirati pomoću drugog elementa.

Primjer:

kali linux terminal

[[1, 2], [3, 4], [1, 4]]

Razvrstani niz: [[1, 2], [1, 4], [3, 4]]

Koristili smo funkciju rand() za generiranje nasumičnih elemenata u nizu. U funkciji compare(), moramo tipizirati dva pokazivača na strukturu tipa.

qsort() u C-u

Posebnost korištenja qsort() je prilagođena funkcija usporedbe koju možemo dizajnirati onako kako želimo. Također možemo sortirati nekoliko elemenata u nizu, a ostale ostaviti nesortirane.