- 1 1. Ano ang Quicksort? Mga Batayang Konsepto at Pangkalahatang-ideya
- 2 2. Paglilinaw ng Algoritmo ng Quicksort
- 3 3. Pagpapatupad ng Quicksort sa C
- 4 4. Pagganap at Pag-optimize ng Quicksort
- 5 5. Paghahambing ng Quicksort sa Iba pang Mga Algorithm sa Pag-aayos
- 6 6. Karaniwang Mga Error sa Quicksort at Mga Tip sa Debugging
- 7 7. Buod at Mga Hinaharap na Aplikasyon
1. Ano ang Quicksort? Mga Batayang Konsepto at Pangkalahatang-ideya
Ang Quicksort ay isa sa mga algoritmo ng pag-oorganisa at malawakang ginagamit sa C at maraming iba pang mga wika ng programming para sa mahusay na pag-oorganisa ng data. Ang paraang ito, na imbento ni C. A. R. Hoare, ay kilala sa kanyang napakabilis na pagganap.
Batayang Ideya ng Quicksort
Ang Quicksort ay nag-oorganisa ng data sa pamamagitan ng paghihiwalay nito batay sa isang halagang reference na tinatawag na pivot, at pagkatapos ay rekursibong pag-oorganisa ng mga nagsusulungat na subarrays. Sa pamamagitan ng paggamit ng diskarteng hatiin at magtagumpay, ang lahat ng mga elemento ay sa huli ay nai-oorganisa.
- Pivot : Isang arbitrarilong napiling halaga na ginagamit upang hatiin ang data sa dalawang grupo.
- Hatiin at Magtagumpay : Isang teknik na naghihiwalay ng isang problema sa mas maliliit na subproblems, nagso-solve sa bawat isa sa kanila, at pagkatapos ay pinagsasama ang mga resulta upang malutas ang pangkalahatang problema.
Kung ikukumpara sa iba pang mga algoritmo ng pag-oorganisa tulad ng bubble sort o insertion sort, ang quicksort ay napakabilis, lalo na para sa malalaking dataset.
2. Paglilinaw ng Algoritmo ng Quicksort
Susunod, tingnan natin nang mas malapit kung paano gumagana ang algoritmo ng quicksort.
Pagpili ng Pivot
Ang unang hakbang sa quicksort ay ang pagpili ng pivot mula sa array. Ang pivot ay isang mahalagang salik na nakakaapekto sa bilis ng algoritmo, at ang pagganap ay maaaring mag-iba-iba depende sa kung paano pinipili ang pivot.
- Halimbawa : Maaari kang pumili ng unang elemento, huling elemento, o gitnang elemento bilang pivot.
Rekursibong Partitioning
Pagkatapos pumili ng pivot, hatiin ang array sa dalawang bahagi batay sa halaga nito. Ang mga elemento na mas mababa sa pivot ay pupunta sa isang panig, at ang mga mas mataas ay sa isa pa. Kapag natapos na ang operasyon na ito, rekursibong ilapat ang parehong proseso sa natitirang mga subarrays.
- Hakbang 1 : Ilipat ang mga elemento na mas mababa sa pivot sa kaliwang panig, at ang mga mas malalaking elemento sa kanang panig.
- Hakbang 2 : I-apply muli ang quicksort sa bawat isa sa mga nagsusulungat na subarrays.
Habang nagpapatuloy ang rekursibong partitioning na ito, ang buong array ay nai-oorganisa.
3. Pagpapatupad ng Quicksort sa C
Ngayon, tingnan natin ang mga hakbang upang ipatupad ang quicksort sa C. Narito ang isang batayang halimbawa ng code:
#include <stdio.h>
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
int partition(int arr[], int low, int high) {
int pivot = arr[high]; // Choose the last element as pivot
int i = (low - 1); // Index of smaller element
for (int j = low; j <= high - 1; j++) {
if (arr[j] <= pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return (i + 1);
}
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
// Recursively apply quicksort to the divided subarrays
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
int main() {
int arr[] = {10, 7, 8, 9, 1, 5};
int n = sizeof(arr) / sizeof(arr[0]);
quickSort(arr, 0, n - 1);
printf("Sorted array:n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("n"); // Add newline for better output formatting
return 0;
}
Sa code na ito, ang swap function ay nagpapalit ng dalawang elemento, ang partition function ay naghihiwalay ng array gamit ang pivot, at ang quickSort function ay rekursibong nag-oorganisa ng mga subarrays.

4. Pagganap at Pag-optimize ng Quicksort
Madalas na sinasabi na ang Quicksort ay may natatanging pagganap kumpara sa iba pang mga algoritmo ng pag-oorganisa, ngunit ang oras ng pagproseso nito ay maaaring lumala sa mga pinakamasamang sitwasyon. Dito, ipapaliwanag natin ang mga detalye ng kanyang pagganap at mga teknik sa pag-optimize.
Time Complexity at Pinakamasamang Kaso
Ang average time complexity ng quicksort ay O(n log n). Gayunpaman, sa pinakamasamang kaso, tulad ng kapag ang array ay na-oorganisa na o naglalaman ng maraming duplicate values, ito ay maaaring maging O(n^2). Sa mga sitwasyong ito, ang lalim ng recursion ay tumataas at ang efficiency ay bumababa.
Mga Teknik sa Pag-optimize
- Smart Pivot Selection : Sa halip na palaging piliin ang unang o huling elemento, ang pagpili ng gitnang elemento o isang random na elemento bilang pivot ay makakatulong upang balansehin ang paghahati.
- Controlling Recursive Calls : Upang mabawasan ang lalim ng recursion, maaari kang magpatupad ng hindi-recursive na pamamaraan gamit ang mga loop.
5. Paghahambing ng Quicksort sa Iba pang Mga Algorithm sa Pag-aayos
Ang Quicksort ay isang epektibong algorithm sa pag-aayos, ngunit may ilang iba pang popular na algorithm din. Sa seksyong ito, ihahambing natin ang quicksort sa ibang mga algorithm sa pag-aayos at titingnan ang mga kalakasan at kahinaan ng bawat isa.
Quicksort vs. Merge Sort
- How the Algorithm Works : Parehong ang quicksort at merge sort ay batay sa estratehiyang divide and conquer, ngunit magkaiba sila sa kung paano hinahati at pinagsasama ang data. Ang quicksort ay nakatuon sa partitioning at inaayos ang bawat subarray nang magkakahiwalay. Samantala, ang merge sort ay binibigyang-diin ang merging ng mga nakaayos na subarray upang makabuo ng panghuling resulta.
- Performance : Pareho silang may average na time complexity na O(n log n). Gayunpaman, sa pinakamalalang kaso, ang quicksort ay bumababa sa O(n^2), habang ang merge sort ay patuloy na nagbibigay ng O(n log n) na pagganap, na ginagawang mas matatag ito sa ilang sitwasyon.
- Pros and Cons : Karaniwang mas memory-efficient ang quicksort kaysa sa merge sort (hindi ito nangangailangan ng karagdagang memorya para sa merging), kaya angkop ito para sa malalaking dataset. Gayunpaman, kailangang mag-ingat sa pinakamalalang kaso. Ang merge sort ay isang stable na algorithm sa pag-aayos at nagpapanatili ng pare-parehong pagganap, kahit na halos nakaayos na ang data.
Quicksort vs. Heap Sort
- How the Algorithm Works : Ang quicksort ay recursively na hinahati ang array, samantalang ang heap sort ay nagbabago ng data sa isang heap structure at inaayos ang array sa pamamagitan ng paulit-ulit na pagkuha ng pinakamalaking (o pinakamaliit) na elemento. Ang heap sort ay gumagamit ng mga data structure para sa pag-aayos.
- Performance : Ang heap sort ay gumagana rin sa O(n log n) na oras, ngunit madalas itong mas mabagal kaysa sa quicksort sa praktika, lalo na kapag ang data ay hindi random. Sa pangkalahatan, mas epektibo ang quicksort para sa random na data.
- Pros and Cons : Karaniwang mas mabilis ang quicksort kaysa sa heap sort sa tipikal na mga kaso. Gayunpaman, tinitiyak ng heap sort ang O(n log n) na time complexity kahit sa pinakamalalang kaso, kaya ito ay isang ligtas na alternatibo kapag kailangan mo ng garantiya sa pagganap.
Quicksort vs. Bubble Sort
- How the Algorithm Works : Ang bubble sort ay isang napakasimpleng algorithm na nagko-compare ng magkatabing elemento at nagpapalit nito kung kinakailangan. Hindi tulad ng quicksort, kilala itong napaka-inepektibo.
- Performance : Ang bubble sort ay may time complexity na O(n^2), na nagiging mas hindi epektibo kumpara sa quicksort. Madali itong ipatupad para sa maliliit na dataset, ngunit bihira itong ginagamit sa praktika.
- Pros and Cons : Ang bubble sort ay lubos na simple at madaling maunawaan. Gayunpaman, ang pagganap nito ay mas mababa kaysa sa quicksort at hindi angkop para sa karamihan ng totoong mundo na mga kaso.
6. Karaniwang Mga Error sa Quicksort at Mga Tip sa Debugging
Kapag nag-iimplement ng quicksort o gumagamit ng qsort(), maaaring makaranas ka ng ilang uri ng mga error. Ipinaliwanag ng seksyong ito ang mga karaniwang error at kung paano ito aayusin.
1. Stack Overflow
Dahil ang quicksort ay isang recursive na algorithm, ang malalim na recursion ay maaaring magdulot ng stack overflow. Upang maiwasan ito, maaari mong limitahan ang maximum na lalim ng recursion o isaalang-alang ang isang non-recursive implementation.
- Solution : Palitan ang recursive na bahagi ng quicksort ng isang loop upang mabawasan ang panganib ng stack overflow.
2. Infinite Loops
Kung may mga pagkakamali sa recursion o sa pagpili ng pivot, maaaring magtapos ka sa isang infinite loop. Madalas itong nangyayari kapag ang pivot ay hindi napili nang tama o ang kondisyon ng pagtatapos ng pag-aayos ay hindi maayos na nakaset.
- Solution : Suriin muli ang iyong pagpili ng pivot at tiyaking may malinaw na kondisyon ng pagtatapos para sa pag-aayos.
3. Memory Access Violations
Kapag gumagamit ng mga pointer upang manipulahin ang mga elemento ng array, maaaring mangyari ang memory access violations kung maa-access mo ang memorya na nasa labas ng hangganan ng array.
- Solusyon : Tiyaking hindi ka nagre-refer sa labas ng hangganan ng array at na maayos ang pamamahala ng recursion.
7. Buod at Mga Hinaharap na Aplikasyon
Ang Quicksort ay isa sa pinakamabisang mga algorithm sa pag-aayos sa C, lalo na para sa malalaking dataset. Sa pamamagitan ng pagpili ng tamang pivot at pag-aaplay ng stratehiyang hatiin at sakupin, maaaring magamit ang recursive na algorithm na ito sa malawak na hanay ng mga sitwasyon. Bukod pa rito, ang standard na function na qsort() ay nagpapadali sa pagpapatupad ng makapangyarihang pag-aayos.
Sa paggamit ng quicksort sa hinaharap, magpokus sa pagpili ng optimal na pivot batay sa laki ng array at katangian ng iyong data upang higit pang mapabuti ang pagganap. Kapag nagkaroon ng mga error, suriin ang iyong recursion at pamamahala ng memorya.
Inaasahan naming nakatulong ang artikulong ito upang maunawaan mo ang lahat mula sa mga batayan hanggang sa praktikal na pagpapatupad ng quicksort, at magamit ito sa iyong sariling mga programa.




