Download as pdf or txt
Download as pdf or txt
You are on page 1of 40

‫‪Sheet-2‬‬

‫تراكيب البيانات والخوارزميات‬

‫خوارزميات الترتيب‬
‫)‪(SORTING ALGORITHMS‬‬

‫أستاذ المادة‬
‫د‪ .‬خالد سويسي‬
‫ً‬
‫أول‪ :‬خوارزميات الترتيب الداخلي‬
‫(‪)INTERNAL SORTING ALGORITHMS‬‬
‫الجزء (‪)1‬‬
‫ماهي خوارزميات الترتيب (أو الفرز)؟‬

‫■ هي التي تقوم بتنظيم مجموعة من العناصر حسب ترتيب محدد‪.‬‬


‫■ تستخدم في إعادة ترتيب عناصر مصفوفة أو قائمة معينة‪ ،‬وفقًا لعملية مقارنة محددة بين‬
‫العناصر‪.‬‬
‫■ تستخدم عملية المقارنة في تحديد الترتيب الجديد للعناصر في مركب البيانات المحدد‪.‬‬
‫■ يمكن ترتيب عناصر البيانات الرقمية بتسلسل إما تصاعدي أو تنازلي‪.‬‬
‫■ أما عناصر البيانات الحرفية فترتب حسب التسلسل األبجدي‪.‬‬
‫■ عندما يكون حجم البيانات في المصفوفة صغيرة بما يكفي الستيعابها في وقت واحد في‬
‫الذاكرة الرئيسية‪ ،‬فإننا نشير إليها ‪ - 1‬بخوارزمية الترتيب الداخلي‪.‬‬
‫■ من ناحية أخرى‪ ،‬عندما يكون حجم البيانات في المصفوفة كبيرة لحد يتطلب فيه ذاكرة ثانوية‬
‫(خارجية) غير الذاكرة الرئيسية‪ ،‬يشار إليها على أنها ‪ - 2‬خوارزمية الترتيب الخارجي‪.‬‬
‫الغرض من عمليات الترتيب‬
‫■ لزيادة كفاءة عملية البحث عن عنصر معين‪ ،‬كتوفير الوقت أثناء عملية‬
‫البحث‪.‬‬
‫■ للتقليل من حركة البيانات أثناء تبديلها‪ ،‬حيث إن عملية المبادلة تأخذ جز ًءا‬
‫كبيرا من وقت المعالجة ‪.‬‬
‫ً‬
‫■ لتبسيط معالجة الملفات‪ - :‬فالملفات تتألف من مجموعة حقول ولترتيبها نحتاج‬
‫الستخدام مفاتيح ترتيب معينة لتسهيل عملية البحث والبرمجة‪.‬‬
‫لً‪ :‬ملف يحتوي على ثلثة حقول حيث أن الحقل األول لتسلسل الطالب‪،‬‬ ‫■ فمث ً‬
‫والحقل الثاني لتخزين إسم الطالب والحقل الثالث للمعدل‪ .‬فيمكن ترتيب بيانات‬
‫الملف الداخلية باستخدام مفتاح معين مثل لترتيب األسماء أبجديا أو الترتيب‬
‫حسب معدل الطالب‪.‬‬
‫أنواع خوارزميات الترتيب الداخلية‬
‫■ يمكننا فقط استخدام خوارزمية الترتيب الداخلي إذا كان من الممكن تنظيم‬
‫جميع البيانات المراد ترتيبها في وقت واحد في الذاكرة الرئيسية‪.‬‬
‫■ فخوارزمية الترتيب الداخلي تواجه قيودًا على الذاكرة‪ ،‬حيث يمكنها فقط‬
‫معالجة مصفوفة صغيرة قادرة على العمل دفعة واحدة في الذاكرة األساسية‪.‬‬
‫■ سيتم التركيز في هذا الفصل على خوارزميات الترتيب الداخلية التالية‪- :‬‬
‫‪ .1‬الترتيب بالحشر (‪.)Insertion Sort‬‬
‫‪ .2‬الترتيب باالختيار (‪.)Selection Sort‬‬
‫‪ .3‬الترتيب السريع (‪.)Quick Sort‬‬
‫‪ .4‬ترتيب الفقاعة (‪.)Bubble Sort‬‬
‫‪ -1‬خوارزمية الترتيب بالحشر‬
‫(‪)INSERTION SORT‬‬
‫‪ -1‬خوارزمية الترتيب بالحشر (‪)Insertion Sort‬‬
‫كثيرا طريقة اللعب بالورق عندما‬
‫ً‬ ‫■ عبارة عن خوارزمية ترتيب بسيطة‪ ،‬تشبه‬
‫تقوم بترتيب األوراق في يدك‪.‬‬

‫عنصرا واحدًا فقط في مكانه الصحيح في كل‬


‫ً‬ ‫■ يتم الترتيب بأسلوب نقل وإدخال‬
‫مرة‪.‬‬

‫■ من مميزات هذه الخوارزمية ما يلي‪:‬‬


‫– هي أحد أبسط الخوارزميات من حيث التنفيذ‪.‬‬
‫– تعتبر فعالة جدا مع المصفوفات صغيرة الحجم‪.‬‬
‫– ملئمة جدًا في استخدامها مع المصفوفة التي أغلبها مرتبة في األصل‪.‬‬
‫خطوات عمل خوارزمية الترتيب بالحشر‬
‫■ لترتيب مصفوفة بحجم ‪ N‬بترتيب تصاعدي حسب ما يلي‪:‬‬
‫‪ .1‬من المفترض أن العنصر األول في المصفوفة مرتب‪ .‬عليه سيتم أخذ العنصر‬
‫الثاني وتخزينه كمفتاح (‪ )key‬ليتم مقارنته بالعنصر الذي يسبقه‪.‬‬
‫– هنا سيتم مقارنة العنصر المفتاح (‪ )key‬مع العنصر األول‪ ،‬وإذا كان‬
‫العنصر األول أكبر فسيتم نقل العنصر المفتاح مكان العنصر األول‪.‬‬
‫‪ .2‬بعد ترتيب العنصرين األولين‪ ،‬نأخذ العنصر الثالث كمفتاح ونقارنه بالعناصر‬
‫الموجودة يساره‪.‬‬
‫– هنا نضع العنصر المفتاح خلف العنصر األصغر منه‪ ،‬إذا ال يوجد عنصر‬
‫أصغر منه نضعه هو العنصر األول في المصفوفة‪.‬‬
‫‪ .3‬بنفس الطريقة‪ ،‬نضع كل عنصر لم يتم ترتيبه (أو نقله) في مكانه الصحيح‪.‬‬
‫مثال توضيحي لخوارزمية الترتيب بالحشر‬
‫الدالة البرمجية لخوارزمية الترتيب بالحشر بلغة ‪C++‬‬
‫دالة ترتيب مصفوفة باستخدام ‪//‬‬
‫الترتيب بالحشر ‪//‬‬
‫)‪void insertionSort(int arr[], int n‬‬
‫{‬
‫;‪int i, key, j‬‬
‫{ )‪for (i = 1; i < n; i++‬‬
‫;]‪key = arr[i‬‬
‫;‪j = i - 1‬‬

‫نقل عناصر المصفوفة(]‪//)arr[0..i-1‬‬


‫التي هي أكبر من عنصر المفتاح (‪//)Key‬‬
‫موقع واحد لألمام بعد موقعها الحالي‪//‬‬
‫{ )]‪while (j >= 0 && key < arr[j‬‬
‫;]‪arr[j + 1] = arr[j‬‬
‫;‪j = j - 1‬‬
‫}‬
‫;‪arr[j + 1] = key‬‬
‫}‬
‫}‬
‫‪ -2‬خوارزمية الترتيب بالختيار‬
‫(‪)SELECTION SORT‬‬
‫‪ -2‬خوارزمية الترتيب بالختيار (‪)Selection Sort‬‬

‫■ هذه الخوارزمية تقوم بترتيب المصفوفة عن طريق‬


‫إيجاد العنصر األصغر باستمرار (في حالة نستخدم‬
‫الترتيب التصاعدي) من الجزء غير مرتب من‬
‫المصفوفة‪ ،‬ووضعه في أول المصفوفة‪.‬‬
‫■ تقوم هذه الخوارزمية بتقسيم المصفوفة إلى مصفوفتان‬
‫فرعيتان كما يلي‪:‬‬
‫– مصفوفة فرعية مرتبة‪.‬‬
‫– مصفوفة فرعية غير مرتبة‪.‬‬
‫■ في كل عملية تكرار (حلقة بحث)‪ ،‬يتم تحديد العنصر‬
‫األصغر من جهة المصفوفة الفرعية الغير مرتبة‪،‬‬
‫ومن ثم نقله إلى المصفوفة الفرعية المرتبة‪.‬‬
‫مثال توضيحي لعمل خوارزمية الترتيب بالختيار‬
‫الدالة البرمجية لخوارزمية الترتيب بالختيار بلغة ‪C++‬‬
‫دالة التبديل (‪// )swap‬‬
‫)‪void swap(int *xp, int *yp‬‬
‫{‬
‫;‪int temp = *xp‬‬
‫;‪*xp = *yp‬‬
‫;‪*yp = temp‬‬
‫}‬

‫دالة الترتيب باالختيار (‪// )selectionSort‬‬


‫)‪void selectionSort(int arr[], int n‬‬
‫{‬
‫;‪int i, j, min‬‬

‫تغير حدود المصفوفة الفرعية الغير مرتبة خطوة بخطوة ‪//‬‬


‫{ )‪for (i = 0; i < n - 1; i++‬‬

‫إيجاد العنصر األصغر في المصفوفة الفرعية الغير مرتبة ‪//‬‬


‫;‪min = i‬‬
‫{ )‪for (j = i + 1; j < n; j++‬‬
‫)]‪if (arr[j] < arr[min‬‬
‫;‪min = j‬‬
‫}‬

‫تبديل العنصر األصغر مع العنصر األول ‪//‬‬


‫)‪if (min != i‬‬
‫;)]‪swap(arr[min], arr[i‬‬
‫}‬
‫}‬
‫مميزات وعيوب خوارزمية الترتيب بالختيار‬
‫■ مميزات الترتيب بالختيار‪:‬‬
‫– خوارزمية بسيطة وسهلة الفهم‪.‬‬
‫– تعمل بشكل جيد مع مجموعات البيانات الصغيرة‪.‬‬
‫■ عيوب الترتيب بالختيار‪:‬‬
‫– ال تعمل بشكل جيد على مجموعات البيانات الكبيرة‪.‬‬
‫– تعتبر من الخوارزميات الغير مستقرة ألنها ال تحافظ على‬
‫الترتيب النسبي للعناصر ذات القيم المتساوية‪.‬‬
‫‪ -3‬خوارزمية الترتيب السريع‬
‫(‪)QUICK SORT‬‬
‫‪ -3‬خوارزمية الترتيب السريع (‪)Quick Sort‬‬
‫تعرف بخوارزمية فرق تسد (‪.)Divide and Conquer algorithm‬‬ ‫▪‬
‫أوال تقوم بتحديد عنصر يكون هو (العنصر المحوري ‪.)Pivot -‬‬ ‫▪‬
‫بعدها يتم تقسيم المصفوفة المطلوب ترتيبها حول المحور المحدد‪.‬‬ ‫▪‬
‫■ الختيار عنصر يكون هو المحور يتم حسب عدة اختيارات‬
‫كما يلي‪:‬‬
‫– إما ان نختار دائ ًما العنصر األول في المصفوفة‬
‫كمحور‪.‬‬
‫– أو نختار دائ ًما العنصر األخير ليكون المحور‪( .‬سنطبق‬
‫هذا الح ًقا)‪.‬‬
‫عنصرا عشوائيًا كمحور‪.‬‬
‫ً‬ ‫– أو نختار‬
‫– أو نختار العنصر األوسط كمحور‪.‬‬
‫خطوات عمل خوارزمية الترتيب السريع (ترتيب تصاعدي)‬
‫‪ .1‬يتم تقسيم المصفوفة إلى مصفوفتان فرعيتان بعد تحديد العنصر المحوري‬
‫(سنعتمد هنا على أن يكون العنصر األخير هو المحور)‪.‬‬
‫‪ .2‬أثناء تقسيم المصفوفة‪ ،‬يجب االحتفاظ بالعناصر األقل من المحور على الجانب‬
‫األيسر والعناصر األكبر على الجانب األيمن من المحور‪.‬‬
‫‪ .3‬نستمر في تقسيم المصفوفتين الفرعيتين اليسرى واليمنى باستخدام نفس‬
‫الطريقة‪ .‬حتى نصل إلى أن كل مصفوفة فرعية تحتوي على عنصر واحد‪.‬‬
‫‪ .4‬بعد ذلك‪ ،‬يتم ترتيب العناصر في المصفوفتين الفرعيتين (انتبه‪ :‬بأن في هذه‬
‫المرحلة يوجد عنصر واحد في كل المصفوفتين كما ذكرنا في الخطوة‬
‫السابقة)‬
‫أخيرا يتم دمج عناصر المصفوفتين بعد الترتيب لترجع مصفوفة واحدة مرتبة‪.‬‬
‫ً‬ ‫‪.5‬‬
‫مثال توضيحي لعمل خوارزمية الترتيب السريع‬
‫المرحلة األولى‬ ‫المرحلة الثانية‬
‫الدالة البرمجية لخوارزمية الترتيب السريع بلغة ‪C++‬‬
‫)‪int partition(int arr[],int low,int high‬‬
‫{‬
‫اختيار المحور‪//‬‬
‫;]‪int pivot= arr[high‬‬
‫تحديد فهرس العنصر األصغر وموقعه الصحيح بالنسبة للمحور المحدد‪//‬‬
‫;)‪int i= (low-1‬‬

‫)‪for(int j= low; j<= high; 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‬‬
‫{‬
‫‪ pi‬هو قيمة المحور في كل عملية تقسيم ‪//‬‬
‫;)‪int pi= partition(arr, low, high‬‬

‫االستدعاء الحلقي‪//‬‬
‫وضع العناصر األصغر من المحور جهة اليسار‪//‬‬
‫والعناصر األكبر من المحور جهة اليمين‪//‬‬
‫;)‪quickSort(arr, low, pi-1‬‬
‫;)‪quickSort(arr, pi+1, high‬‬
‫}‬
‫}‬
‫مميزات وعيوب خوارزمية الترتيب السريع‬
‫■ مميزات الترتيب السريع‪:‬‬
‫– تعرف بخوارزمية( فرق تسد) والتي تجعلها من أسهل‬
‫الخوارزميات وأكثرها استخدا ًما‪.‬‬
‫– فعاله مع مجموعات البيانات الكبيرة‪.‬‬
‫– لديها حمل منخفض على الذاكرة‪ ،‬ألنها تتطلب فقط حجم صغير‬
‫من الذاكرة عند تنفيذها‪.‬‬
‫■ عيوب الترتيب السريع‪:‬‬
‫– إذا تم اختيار خاطئ للمحور فان وقت تنفيذها يصبح عالي‪.‬‬
‫– غير فعالة مع كمية البيانات الصغيرة‪.‬‬
‫‪ -4‬خوارزمية ترتيب الفقاعة‬
‫(‪)BUBBLE SORT‬‬
‫‪ -4‬خوارزمية ترتيب الفقاعة (‪)Bubble Sort‬‬
‫■ تعتبر من خوارزميات الترتيب البسيطة أي ً‬
‫ضا‪.‬‬
‫■ هذه الخوارزمية قائمة على المقارنة المتكررة حيث تقوم بمقارنة كل‬
‫عنصرين متجاورين وتقوم بتبديلهما حتى الوصول إلى الترتيب المطلوب‪.‬‬
‫■ تقوم هذه الخوارزمية بمقارنة جميع عناصر المصفوفة وترتيبها بنا ًًء على‬
‫قيمها‪.‬‬
‫■ يطلق على هذه الخوارزمية بخوارزمية ترتيب الفقاعة الن حركة عناصر‬
‫المصفوفة عند الترتيب تشبه حركة فقاعات الهواء في الماء‪.‬‬
‫■ ترتفع فقاعات الهواء للسطح وبنفس هذه الطريقة تنتقل عناصر المصفوفة‬
‫األكبر إلى نهاية المصفوفة في كل عملية تكرار‪.‬‬
‫خطوات عمل خوارزمية ترتيب الفقاعة (ترتيب تصاعدي)‬
‫ستبدأ الخوارزمية بمقارنة العنصر األول من المصفوفة بالعنصر‬ ‫‪.1‬‬
‫الثاني‪.‬‬
‫وإذا كان العنصر األول أكبر من العنصر الثاني‪ ،‬فسيتم تبديل كل‬ ‫‪.2‬‬
‫العنصرين‪.‬‬
‫وبعد ذلك ننتقل للمقارنة بين العنصر الثاني والثالث وهكذا‪.‬‬ ‫‪.3‬‬
‫سيتم نقل العنصر األكبر إلى أقصى اليمين في أول حلقة تكرار‪.‬‬ ‫‪.4‬‬
‫وتستمر بعد ذلك هذه العملية للعثور على ثاني أكبر عنصر‬ ‫‪.5‬‬
‫ووضعه في أخر المصفوفة وهكذا حتى يتم ترتيب جميع‬
‫العناصر‪.‬‬
‫مثال توضيحي لعمل خوارزمية ترتيب الفقاعة‬
C++ ‫الدالة البرمجية لخوارزمية ترتيب الفقاعة بلغة‬

void bubbleSort(int arr[], int n)


{
int i, j;
for (i = 0; i < n - 1; i++)
for (j = 0; j < n - i - 1; j++)
if (arr[j] > arr[j + 1])
swap(arr[j], arr[j + 1]);
}
‫ثانيًا‪ :‬خوارزميات الترتيب الخارجي‬
‫(‪)EXTERNAL SORTING ALGORITHMS‬‬
‫الجزء (‪)2‬‬
‫مفهوم خوارزميات الترتيب الخارجي‬
‫■ الترتيب الخارجي هو مصطلح يشير إلى فئة من خوارزميات الترتيب التي يمكنها التعامل‬
‫مع كميات هائلة (كبيرة جدًا ً) من البيانات‪.‬‬
‫■ نحتاجها عندما تكون البيانات التي نريد ترتيبها حجمها كبير جدا بحث ال تستوعبها الذاكرة‬
‫الرئيسية (وهي ذاكرة الوصول العشوائي – ‪.)RAM‬‬
‫■ عليه‪ ،‬سيتم تخزين تلك البيانات الكبيرة في ذاكرة ثانوية (خارجية) بطيئة (عادتًا يستخدم‬
‫القرص الصلب – ‪.)Hard Disk‬‬
‫■ يستخدم الترتيب الخارجي استراتيجية الترتيب بالدمج (‪ )Merge Sort‬والتي تعتمد في‬
‫عملها على أسلوبين هما‪:‬‬
‫‪ .1‬مرحلة الترتيب‪ :‬تقوم خوارزمية الترتيب الخارجي بتقسيم البيانات الكبيرة إلى أجزاء‬
‫صغيرة تستوعبها الذاكرة الرئيسية ومن ثم ترتيبها وحفظها داخل ملف فرعي‪.‬‬
‫‪ .2‬مرحلة الدمج‪ :‬يتم دمج الملفات الفرعية التي تم ترتيبها في ملف واحد كبير‪.‬‬
‫ما هي خوارزمية الترتيب بالدمج الخارجية؟‬
‫■ تشبه كثيرا خوارزمية الترتيب السريع التي‬
‫تستخدم استراتيجية (فرق تسد)‪.‬‬
‫■ حيث تقوم هذه الخوارزمية بتقسيم المصفوفة‬
‫إلى مصفوفات فرعية أصغر‪ ،‬حتى نصل‬
‫إلى أن كل مصفوفة فرعية تحتوي على‬
‫عنصر واحد فقط‪.‬‬
‫■ بعد ذلك‪ ،‬تقوم بترتيب كل مصفوفة فرعية‬
‫على حدى‪.‬‬
‫■ ثم بعد ذلك‪ ،‬تقوم بدمج المصفوفات الفرعية‬
‫التي تم ترتيبها مرة أخرى معًا لتكون‬
‫مصفوفة واحدة كاملة ومرتبة بشكل نهائي‪.‬‬
‫خطوات عمل خوارزمية الترتيب بالدمج (ترتيب تصاعدي)‬
‫■ القاعدة االساسية لعمل خوارزمية الترتيب بالدمج تتضمن الخطوات التالية‪:‬‬

‫يتم تقسيم المصفوفة الغير مرتبة إلى مصفوفتين فرعيتين‪.‬‬ ‫‪.1‬‬


‫نستمر في تقسيم المصفوفتين الفرعيتين إلى مصفوفات فرعية‪ ،‬حتى نصل‬ ‫‪.2‬‬
‫إلى أن كل مصفوفة فرعية تحتوي على عنصر واحد فقط‪.‬‬
‫بعد ذلك‪ ،‬نأخذ المصفوفتين المتجاورتين والتي تحتوي كل منهما على‬ ‫‪.3‬‬
‫عنصر واحد وترتيبهما تصاعديًا‪ ،‬ومن ثم دمجهما لتكوين مصفوفة مكونة‬
‫من عنصرين‪.‬‬
‫يتم تكرار العملية كما في الخطوة السابقة‪ ،‬حتى يتم الحصول على‬ ‫‪.4‬‬
‫مصفوفة واحدة مرتبة‪.‬‬
‫مثال يوضيح عمل خوارزمية الترتيب بالدمج‬
C++ ‫الدالة البرمجية لخوارزمية الترتيب بالدمج بلغة‬
void merge( ) ‫ دالة الدمج‬:‫أول‬
//. array[] ‫دالة دمج المصفوفتين الغرعيتين من المصفوفة األصلية‬
// arr[begin..mid] ‫أوال دمج عناصر المصفوفة الفرعية ناحية اليسار هي‬
// arr[mid+1..end] ‫ثانيا دمج عناصر المصفوفة الفرعية ناحية اليمين هي‬
void merge(int array[], int const left, int const mid,
int const right)
{
int const subArrayOne = mid - left + 1;
int const subArrayTwo = right - mid;

// ‫هنا يتم إنشاء مصفوفتين جديديتين مؤقتة‬


int leftArray[subArrayOne], rightArray[subArrayTwo];

// array[] ‫هنا يتم نسخ عناصر المصفوفة األصلية‬


// rightArray[] ‫ و‬leftArray[] ‫إلى المصفوفتين الجديدتين‬
for (int i = 0; i < subArrayOne; i++)
leftArray[i] = array[left + i];
for (int j = 0; j < subArrayTwo; j++)
rightArray[j] = array[mid + 1 + j];

int indexOfSubArrayOne = 0, indexOfSubArrayTwo = 0;


int indexOfMergedArray = left;
...‫يتبع‬
void merge( ) ‫ دالة الدمج‬:‫أول‬
// ‫هنا يتم دمج المصفوفتين الفرعيتين من جديد‬
// array[left..right] ‫داخل المصفوفة األصلية‬
while (indexOfSubArrayOne < subArrayOne && indexOfSubArrayTwo < subArrayTwo) {
if (leftArray[indexOfSubArrayOne] <= rightArray[indexOfSubArrayTwo]) {
array[indexOfMergedArray] = leftArray[indexOfSubArrayOne];
indexOfSubArrayOne++;
}
else {
array[indexOfMergedArray] = rightArray[indexOfSubArrayTwo];
indexOfSubArrayTwo++;
}
indexOfMergedArray++;
}

// ‫هنا يتم نسخ العناصر المتبقية في المصفوفة الفرعية‬


// ‫ والتي لم تتغير مواقعها‬، leftArray[] ‫ناحية اليسار‬
while (indexOfSubArrayOne < subArrayOne) {
array[indexOfMergedArray] = leftArray[indexOfSubArrayOne];
indexOfSubArrayOne++;
indexOfMergedArray++;
}
...‫يتبع‬
void merge( ) ‫ دالة الدمج‬:‫أول‬

// ‫هنا يتم نسخ العناصر المتبقية في المصفوفة الفرعية‬


// ‫ والتي لم تتغير مواقعها‬، rightArray[] ‫ناحية اليمين‬
while (indexOfSubArrayTwo < subArrayTwo) {
array[indexOfMergedArray] = rightArray[indexOfSubArrayTwo];
indexOfSubArrayTwo++;
indexOfMergedArray++;
}
}
‫يتبع‪...‬‬
‫ثانيا‪ :‬دالة الترتيب ) (‪void mergeSort‬‬

‫هنا دالة الترتيب والتي تقوم بترتيب العناصر تصاعديا ‪//‬‬


‫ثم تستدعى داخلها دالة الدمج ) (‪ merge‬بعد ترتيبها ‪//‬‬
‫أوال‪ :‬تبدأ بترتيب عناصر المصفوفة الفرعية ناحية اليسار ‪//‬‬
‫ثم ثانيا‪ :‬تنتقل لترتيب عناصر المصفوفة الفرعية ناحية اليمين ‪//‬‬
‫)‪void mergeSort(int array[], int const begin, int const end‬‬
‫{‬
‫{)‪if (begin < end‬‬
‫;‪int mid = (begin + end) / 2‬‬
‫;)‪mergeSort(array, begin, mid‬‬
‫;)‪mergeSort(array, mid + 1, end‬‬
‫;)‪merge(array, begin, mid, end‬‬
‫}‬
‫}‬
‫مميزات خوارزمية الترتيب بالدمج‬
‫■ ثابتة أو مستقرة ألبعد حد (‪ :)Stability‬تحافظ على الترتيب النسبي‬
‫للعناصر المتساوية في المصفوفة المراد ترتيبها‪.‬‬
‫■ تضمن أداء عالي (‪ :)High performance‬تؤدي عملية الترتيب‬
‫بشكل جدا عالي خاصتا مع عناصر البيانات الكبيرة جدا‪.‬‬
‫■ قابلية التوازي (‪ :)Parallelizable‬حيث أن بطبيعتها تعتبر‬
‫خوارزمية تعمل بالتوازي‪ ،‬ومعنى ذلك أنها تستطيع الستفادة من‬
‫المعالجات المتعددة (‪ )multiple processors‬التي تقوم بتوزيع‬
‫العمليات بشكل متوازي ومنظم‪.‬‬
‫عيوب خوارزمية الترتيب بالدمج‬
‫■ تستهلك مساحة أكبر (‪ :)Space complexity‬تتطلب ذاكرة‬
‫أضافية لتخزين المصفوفات الفرعية التي تقوم بتقسيمها ثم دمجها‬
‫مرة أخرى أثنا عملية الترتيب‪.‬‬
‫■ غير مثالية عادتا مع البيانات الصغيرة‪ :‬لديها تعقيد زمني ( ‪time‬‬
‫‪ )complexity‬عالى خاصتا مع عناصر البيانات الصغيرة في‬
‫الحجم‪ ،‬أعلى من بعض خوارزميات الترتيب األخرى (على سبيل‬
‫المثال‪ :‬خوارزمية الحشر)‪ ،‬والتي من الممكن أن ينتج عنها أداء‬
‫بطئ مع كمية البيانات الصغيرة‪.‬‬
‫النهاية‬

THANK YOU ☺

You might also like