4.7 - אלגוריתמים - הרצאה
הפונקציה qsort משמשת למיון מערך כלשהו - כל עוד תספק לה מידע על סוג האלמנטים ואיך משווים ביניהם. הפונקציה משתמשת באלגוריתם quicksort, ויכולה למיין כל סוג של מבנה - מספרים, מחרוזות, מבנים וכו'.
התחביר:
הפרמטרים:
-
base- מצביע לתחילת המערך -
nmemb- מספר האיברים במערך -
size- גודל של כל איבר (למשלsizeof(int)) -
compar- פונקציית השוואה שתחזיר:-
מספר שלילי אם a < b
-
אפס אם a == b
-
מספר חיובי אם a > b
-
דוגמה: מיון מערך של מספרים שלמים
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a, const void *b) {
return (*(int *)a - *(int *)b);
}
int main() {
int arr[] = {5, 1, 4, 2, 3};
int n = sizeof(arr) / sizeof(arr[0]);
qsort(arr, n, sizeof(int), cmp);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
הפלט:
הפונקציה qsort שיכתבה את המערך המקורי במקום (in-place).
הפונקציה bsearch מבצעת חיפוש בינארי בתוך מערך ממוין. היא מחפשת איבר מתאים על פי מפתח (key) ומחזירה מצביע אליו אם נמצא, או NULL אם לא.
התחביר:
void *bsearch(const void *key, const void *base,
size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
-
key- מצביע לערך שאתה מחפש -
base- תחילת המערך (חייב להיות ממוין!) -
nmemb- מספר האיברים -
size- גודל של כל איבר -
compar- אותה פונקציית השוואה כמו ב-qsort
דוגמה:
int arr[] = {1, 2, 3, 4, 5};
int target = 3;
int *found = bsearch(&target, arr, 5, sizeof(int), cmp);
if (found != NULL) {
printf("נמצא: %d\n", *found);
} else {
printf("לא נמצא\n");
}
אם המערך לא ממויין - bsearch עלול להחזיר תוצאה שגויה או לא למצוא את הערך.
לסיכום:
-
qsortממיינת מערכים - עליך לספק פונקציית השוואה מתאימה -
bsearchמחפשת ערך במערך ממויין - עם אותה פונקציית השוואה -
שתיהן פועלות על void* ולכן עובדות גם עם טיפוסים מורכבים
-
פונקציית ההשוואה תמיד מקבלת שני מצביעים ל-void - יש להמיר אותם לטיפוס המתאים עם
*ו-(type *) -
חובה לדעת אם המערך כבר ממויין לפני השימוש ב-
bsearch