ترتيبا الفقاعات والإدراج
ترتيبات بسيطة
ترتيبا الفقاعات والإدراج درس مجاني في C Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 4 دروس في المجموع.
خوارزميات الترتيب البسيطة
الترتيب الفقاعي وترتيب الإدراج هما أبسط خوارزميتي ترتيب بالمقارنة. تبلغ تكلفة كل منهما O(n تربيع) في أسوأ الحالات، لكنهما سهلتا الفهم ومفيدتان للمصفوفات الصغيرة أو شبه المرتبة.
كيف يعمل الترتيب الفقاعي
يجتاز الترتيب الفقاعي المصفوفة مرارًا، ويبدّل الأزواج المتجاورة الخارجة عن الترتيب. بعد كل مرور كامل، يطفو أكبر عنصر متبقٍ إلى موضعه النهائي في النهاية.
تبديل عددين صحيحين
يساعد وجود دالة مساعدة قابلة لإعادة الاستخدام للتبديل في إبقاء كود الترتيب منظمًا.
#include <stdio.h>
void swap(int *a, int *b) {
int t = *a; *a = *b; *b = t;
}
int main(void) {
int x = 1, y = 2;
swap(&x, &y);
printf("%d %d\n", x, y);
return 0;
}تنفيذ الترتيب الفقاعي
تُستخدم حلقات متداخلة: تحسب الحلقة الخارجية عدد مرات المرور، بينما تقارن الحلقة الداخلية الأزواج المتجاورة وتبدّلها. بعد المرور i، تكون العناصر i الأخيرة مرتبة.
#include <stdio.h>
void bubble_sort(int a[], int n) {
for (int i = 0; i < n - 1; i++)
for (int j = 0; j < n - 1 - i; j++)
if (a[j] > a[j + 1]) {
int t = a[j]; a[j] = a[j + 1]; a[j + 1] = t;
}
}
int main(void) {
int a[] = {5, 2, 9, 1, 3};
bubble_sort(a, 5);
for (int i = 0; i < 5; i++) printf("%d ", a[i]);
printf("\n");
return 0;
}تحسين الخروج المبكر
إذا لم يُجرِ مرور كامل أي تبديلات، فهذا يعني أن المصفوفة مرتبة بالفعل ويمكنكم التوقف. يجعل ذلك الترتيب الفقاعي بتكلفة O(n) عند إدخال مصفوفة مرتبة مسبقًا.
#include <stdio.h>
void bubble_sort(int a[], int n) {
for (int i = 0; i < n - 1; i++) {
int swapped = 0;
for (int j = 0; j < n - 1 - i; j++)
if (a[j] > a[j + 1]) {
int t = a[j]; a[j] = a[j + 1]; a[j + 1] = t; swapped = 1;
}
if (!swapped) break;
}
}
int main(void) {
int a[] = {1, 2, 3, 4, 5};
bubble_sort(a, 5);
printf("sorted with early exit\n");
return 0;
}كيف يعمل ترتيب الإدراج
ينشئ ترتيب الإدراج منطقة مرتبة في المقدمة. ولكل عنصر جديد، يزيح العناصر المرتبة الأكبر إلى اليمين، ثم يضع العنصر الجديد في موضعه، مثل ترتيب أوراق اللعب في اليد.
تنفيذ ترتيب الإدراج
خذوا العنصر key = a[i]، ثم أزيحوا كل عنصر أكبر في a[0..i-1] خانةً واحدة إلى اليمين، وأدرجوا key في الفجوة.
#include <stdio.h>
void insertion_sort(int a[], int n) {
for (int i = 1; i < n; i++) {
int key = a[i];
int j = i - 1;
while (j >= 0 && a[j] > key) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = key;
}
}
int main(void) {
int a[] = {5, 2, 9, 1, 3};
insertion_sort(a, 5);
for (int i = 0; i < 5; i++) printf("%d ", a[i]);
printf("\n");
return 0;
}ترتيب الإدراج للبيانات شبه المرتبة
يتألق ترتيب الإدراج عندما تكون المصفوفة مرتبة تقريبًا: إذ يتحرك كل عنصر بضع خانات فقط، مقتربًا من O(n). ولهذا يُستخدم كخطوة نهائية في خوارزميات الترتيب الهجينة.
#include <stdio.h>
void insertion_sort(int a[], int n) {
for (int i = 1; i < n; i++) {
int key = a[i], j = i - 1;
while (j >= 0 && a[j] > key) { a[j+1] = a[j]; j--; }
a[j+1] = key;
}
}
int main(void) {
int a[] = {1, 2, 4, 3, 5}; /* one out of place */
insertion_sort(a, 5);
for (int i = 0; i < 5; i++) printf("%d ", a[i]);
printf("\n");
return 0;
}الاستقرار
كلتا الخوارزميتين مستقرتان: تحافظ العناصر المتساوية على ترتيبها النسبي الأصلي، لأن التبديل أو الإزاحة لا يحدثان إلا عند تحقق مقارنة أكبر تمامًا. ويهم الاستقرار عند ترتيب السجلات وفق مفاتيح متعددة.
مقارنة التعقيد
تبلغ تكلفة كلتيهما O(n تربيع) في المتوسط وفي أسوأ الحالات، لكنهما تختلفان عمليًا:
- الترتيب الفقاعي: تبديلات كثيرة، ونادرًا ما يُستخدم في الكود الفعلي
- ترتيب الإدراج: عمليات كتابة أقل، وممتاز للمصفوفات الصغيرة أو شبه المرتبة
أفضل حالة لكلتيهما مع التحسينات هي O(n).
عدّ العمليات
لنعدّ المقارنات التي ينفذها ترتيب الإدراج على مصفوفة مرتبة عكسيًا، وهي أسوأ حالة.
#include <stdio.h>
int main(void) {
int a[] = {5, 4, 3, 2, 1};
int n = 5; long cmp = 0;
for (int i = 1; i < n; i++) {
int key = a[i], j = i - 1;
while (j >= 0 && (cmp++, a[j] > key)) { a[j+1] = a[j]; j--; }
a[j+1] = key;
}
printf("comparisons = %ld\n", cmp);
return 0;
}تحقق سريع
اختبروا فهمكم لخوارزميات الترتيب البسيطة.
مراجعة
تعلّمتم خوارزميتي ترتيب بسيطتين بتكلفة O(n تربيع).
- يبدّل الترتيب الفقاعي الأزواج المتجاورة في كل مرور
- يزيح ترتيب الإدراج العناصر ويدرجها في مقدمة مرتبة
- كلتاهما مستقرتان؛ وتصل كلتاهما إلى O(n) عند إدخال مرتب مع التحسين
- ترتيب الإدراج هو الخيار العملي الأفضل للبيانات الصغيرة
الأسئلة الشائعة
هل درس «ترتيبا الفقاعات والإدراج» مجاني؟
نعم — نص درس «ترتيبا الفقاعات والإدراج» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.
ماذا ستتعلم في «ترتيبا الفقاعات والإدراج»؟
ترتيبات بسيطة تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟
لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «ترتيبا الفقاعات والإدراج»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟
نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- ترتيبا الفقاعات والإدراج
- Quicksort
- Mergesort
- استخدام qsort