Paano Gamitin ang qsort sa C: Epektibong Pag-uuri ng Array at Estruktura na Ipinaliwanag

1. Pangkalahatang-ideya ng qsort Function

Ang qsort function, na ibinibigay sa C standard library, ay isang makapangyarihang kasangkapan para sa pag-aayos ng mga elemento sa loob ng isang array. Gamit ang quicksort algorithm, kayang mabilis at epektibong baguhin ng qsort ang pagkakasunod-sunod ng data. Ang seksyong ito ay nagpapaliwanag ng mga batayan ng qsort at tinatalakay kung bakit mahalaga ang function na ito sa programang C.

Ano ang qsort?

Ang qsort ay isang maraming gamit na function na nag-aayos ng mga array o listahan batay sa isang user-defined na comparison function. Bilang isang standard na function sa C, ito ay malawakang ginagamit sa iba’t ibang kapaligiran ng pag-develop. Halimbawa, maaari mong epektibong ayusin ang mga array ng integers, mga array ng strings, at kahit mga array ng structures.

#include <stdio.h>
#include <stdlib.h>

int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

int main() {
    int values[] = {40, 10, 100, 90, 20, 25};
    size_t values_len = sizeof(values)/sizeof(values[0]);

    qsort(values, values_len, sizeof(int), compare);

    for(int i = 0; i < values_len; i++) {
        printf("%d ", values[i]);
    }
    return 0;
}

Ang code sa itaas ay nagpapakita ng isang simpleng halimbawa ng pag-aayos ng isang integer array gamit ang qsort. Dito, ang isang comparison function ang nagtatakda ng pagkakasunod-sunod ng mga elemento sa loob ng array.

2. Mga Parameter at Paggamit ng q

Ang prototype para sa qsort ay ang mga sumusunod:

void qsort(void *base, size_t num, size_t size, int (*compar)(const void *, const void *));

Detalye ng mga Parameter

1 base : Pointer sa unang elemento ng array na aayusin.
2. num : Bilang ng mga elemento sa array.
3. size : Laki ng bawat elemento sa bytes.
4. compar : Pointer sa comparison function.

Ang function na ito ay nag-aayos ng mga elemento batay sa comparison function. Ang compar ay tumatanggap ng dalawang elemento bilang argumento at nagbabalik kung alin ang mas malaki. Ang fleksibilidad na ito ay nagbibigay-daan sa iyo na mag-ayos ng iba’t ibang uri ng data.

Paano Lumikha ng Comparison Function

Ang comparison function ay susi sa kung paano gumagana ang qsort. Nagde-define ka ng isang function na nagko-compare ng dalawang elemento, tulad ng ipinapakita sa ibaba:

int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

Ang function na ito ay nagko-compare ng mga halaga ng a at b. Nagbabalik ito ng negatibong halaga kung mas maliit ang a kaysa b, 0 kung magkapareho, o positibong halaga kung mas malaki. Pinapayagan nito ang qsort na ayusin ang array sa pataas na pagkakasunod-sunod.

3. Paano Gumagana ang qsort Internally: Ang Quicksort Algorithm

qsort ay gumagamit ng quicksort algorithm sa loob. Ang Quicksort ay isang divide-and-conquer algorithm na gumagana tulad ng sumusunod:

  1. Pumili ng Pivot : Pumili ng pivot na elemento, kadalasan mula sa gitna o dulo ng array.
  2. Partition : Ilipat ang mga elementong mas maliit kaysa sa pivot papunta sa kaliwa, at ang mas malaki papunta sa kanan.
  3. Recursive Sort : Paulit-ulit na isagawa ang proseso para sa bawat sub-array.

Ang prosesong ito ng paghahati at pagsasama ay nagpapahintulot sa array na maayos nang epektibo. Ang average na time complexity ng Quicksort ay O(n log n), na mas mabilis kumpara sa maraming ibang sorting algorithm. Gayunpaman, sa pinakamalalang kaso (tulad ng mga array na nakaayos na), ang complexity ay maaaring bumaba sa O(n^2), kaya kailangan ng pag-iingat.

4. Paglikha ng Comparison Functions

Ang kapangyarihan ng qsort ay nasa kakayahan nitong gumamit ng custom na comparison functions para sa iba’t ibang uri ng data. Narito ang mga halimbawa para sa iba’t ibang uri ng data.

Comparison Function para sa Integers

int compare_int(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

Comparison Function para sa Strings

int compare_str(const void *a, const void *b) {
    return strcmp(*(const char**)a, *(const char**)b);
}

Comparison Function para sa Structures

struct Person {
    int id;
    const char* name;
};

int compare_person(const void *a, const void *b) {
    return ((struct Person*)a)->id - ((struct Person*)b)->id;
}

Sa pamamagitan ng mga custom na comparison function tulad nito, maaaring flexible na ayusin ng qsort ang mga array batay sa kanilang nilalaman.

5. Pag-aayos ng mga Array ng Structures gamit ang qsort

qsort ay lalong kapaki-pakinabang para sa pag-oorder ng mga array na naglalaman ng mga istraktura. Halimbawa, isaalang-alang ang pag-oorder ng isang array ng mga istraktura ng Person ayon sa kanilang field ng id:

struct Person people[] = {
    {1, "Alice"},
    {3, "Charlie"},
    {2, "Bob"}
};

qsort(people, 3, sizeof(struct Person), compare_person);

Sa pamamagitan ng paggamit ng function na compare_person, maaari mong i-order ayon sa id at ayusin ang pagkakasunod-sunod bilang Alice, Bob, at Charlie.

6. Pag-optimize ng Performance at Paghahambing sa Iba Pang Algoritmo

Performance ng Quicksort

Ang Quicksort ay lubos na epektibo kapag nakikitungo sa random na data, na may average time complexity na O(n log n). Gayunpaman, para sa mga data na na-order na, ang worst-case performance nito ay maaaring bumagsak sa O(n^2). Samakatuwid, habang inirerekomenda ang quicksort para sa random datasets, maaaring mas mabuti ang iba pang mga algoritmo sa ilalim ng tiyak na kondisyon.

Paghahambing sa Heapsort

Ang Heapsort ay nagbibigay ng stable performance sa O(n log n) kahit sa worst case, na ginagawa itong mas consistent kaysa sa quicksort. Gayunpaman, ang quicksort ay karaniwang mas mabilis sa average sa random data, kaya nananatili itong piniling pagpipilian sa karamihan ng mga senaryo.

Paghahambing sa Mergesort

Ang Mergesort ay isa ring stable sorting algorithm na may O(n log n) complexity. Ito ay angkop kapag kinakailangan ang stable sorting (pagpapanatili ng orihinal na order para sa pantay na elemento). Habang ang quicksort ay hindi stable, para sa karamihan ng karaniwang aplikasyon ito ay hindi isang makabuluhang isyu.

7. Konklusyon

Ang qsort ay isang makapangyarihang sorting function na available sa C, na kilala sa kanyang flexibility at bilis. Sa pamamagitan ng paggamit ng custom comparison functions, maaari mong i-sort ang mga array ng iba’t ibang data types at structures, na ginagawa ang qsort na lubos na praktikal para sa real-world use.

Ang pag-unawa sa quicksort algorithm ay nagbibigay-daan sa iyo upang makakuha ng pinakamabuti mula sa qsort. Depende sa iyong dataset at requirements, isaalang-alang ang paghahambing sa iba pang mga algoritmo tulad ng heapsort o mergesort upang i-optimize ang performance.

Subukan ang tamang paggamit ng qsort sa iyong mga hinaharap na development projects upang magsulat ng mas epektibong C programs.

侍エンジニア塾