0% found this document useful (0 votes)
7 views20 pages

Sorting Algorithms

تتناول الوثيقة خوارزميات البحث، بما في ذلك البحث التسلسلي والبحث الثنائي، حيث يوضح البحث التسلسلي كيفية البحث عن عنصر في مصفوفة من خلال مقارنة كل عنصر، بينما يتطلب البحث الثنائي مصفوفة مرتبة ويستخدم طريقة تقسيم للبحث بشكل أكثر كفاءة. كما تتناول الوثيقة خوارزميات الترتيب مثل Selection Sort وInsertion Sort وMerge Sort، موضحة كيفية عمل كل منها والخطوات اللازمة لترتيب العناصر.

Uploaded by

good man
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
7 views20 pages

Sorting Algorithms

تتناول الوثيقة خوارزميات البحث، بما في ذلك البحث التسلسلي والبحث الثنائي، حيث يوضح البحث التسلسلي كيفية البحث عن عنصر في مصفوفة من خلال مقارنة كل عنصر، بينما يتطلب البحث الثنائي مصفوفة مرتبة ويستخدم طريقة تقسيم للبحث بشكل أكثر كفاءة. كما تتناول الوثيقة خوارزميات الترتيب مثل Selection Sort وInsertion Sort وMerge Sort، موضحة كيفية عمل كل منها والخطوات اللازمة لترتيب العناصر.

Uploaded by

good man
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 20

‫‪Searching Algorithms‬‬

‫خوارزميات البحث‬

‫‪Sequential Search‬‬ ‫‪Binary Search‬‬

‫‪Sequential Search (Linear Search) (1‬‬

‫• إذا أردنا البحث عن القيمة ‪ 17‬في الـ‪: Array‬‬


‫نتحقق من أول عنصر في الـ‪ ,Array‬و بما ان‬
‫العنصر يساوي ‪ 17‬فنتوقف عن البحث‪.‬‬
‫عدد المقارنات = ‪.1‬‬

‫• إذا أردنا البحث عن القيمة ‪: 11‬‬


‫نتحقق من كل عنصر (‪ )17,23,5‬و عند الوصول إلى ‪11‬‬
‫نتوقف‪.‬‬
‫عدد المقارنات = ‪.4‬‬

‫• للبحث عن ‪: 7‬‬
‫نتحقق من جميع عناصر الـ‪ Array‬؛ لأن ‪ 7‬غير موجود‪.‬‬
‫عدد المقارنات = ‪.7‬‬
‫‪Searching Algorithms‬‬
‫إذا كان العنصر موجود‪ ,‬الفنكشن يقوم بإرجاع موقع‬
‫(‪ )index‬العنصر‪ .‬و إذا كان غير موجود فإنه يرجع قيمة ‪.-1‬‬

‫لاحظ عند البحث عن القيمة ‪ ,17‬عدد المقارنات = ‪1‬؛‬


‫فإن أفضل و أسرع احتمال لإيجاد عنصر (‪,)Best Case‬‬
‫عندما يكون في أول موقع في الـ‪.Array‬‬

‫و الـ(‪ )Average Case‬و الـ(‪ ,)Worst Case‬عندما يكون‬


‫العنصر اما في الوسط او في الاًخر او غير موجود‪.‬‬

‫)‪Best Case : O(1‬‬


‫)‪Average Case : O(n‬‬
‫)‪Worst Case : O(n‬‬

‫من إيجابيات الـ ‪: Sequential Search‬‬


‫‪ -‬سهل الفهم و التطبيق‪.‬‬
‫‪ -‬الـ‪ Array‬قد يكون مرتب او غير مرتب‪.‬‬

‫من سلبياته ‪:‬‬


‫‪ -‬بطيء؛ لأنه يقوم بالتشييك على كل عنصر في الـ‪.Array‬‬
‫‪Searching Algorithms‬‬
‫‪Binary Search (2‬‬
‫يجب ان تكون الـ‪ Array‬مرتبة (‪ )Sorted‬حتى‬
‫نستطيع تطبيقها‪.‬‬
‫و قد يكون مرتب تصاعدياً أو تنزلياً‪.‬‬

‫‪First‬‬ ‫‪Last‬‬

‫أولا ً‪ :‬إيجاد قيمة الوسيط (‪ ,)mid‬و هي أندكس العنصر‬


‫في منتصف الـ‪ .Array‬في مثالنا العنصر ‪ 39‬هو ‪.mid‬‬
‫طريقة الحساب‪:‬‬
‫‪mid = (first_index + last_index) / 2‬‬

‫و في مثالنا‪mid = (0+11) / 2 = 5 ,‬‬


‫(لاحظ بأن ‪ 11/2‬يساوي ‪ ,5.5‬فيصبح ‪5‬؛ لأن قيمة الاندكس‬
‫تكون ‪.)int‬‬

‫• ما فائدة الـ‪mid‬؟‬
‫نسهل عملية البحث!‬
‫ّ‬ ‫لتقسيم الـ‪ Array‬إلى جزئين؛ حتى‬
‫‪Searching Algorithms‬‬
‫بعد إيجاد قيمة ‪ ,mid‬نقوم بمقارنة العنصر المراد البحث‬
‫عنه مع قيمة ‪ .mid‬فإذا تطابق القيمتين‪ ,‬الفنكشن يرجع‬
‫قيمة ‪.mid‬‬
‫فرضاً نريد البحث عن العنصر ‪ ,48‬فنقوم بمقارنة قيمة‬
‫‪ mid‬بالعنصر ‪ ,45‬وبما ان ‪ 48 ≠ 39‬فنستمر بالبحث‪.‬‬

‫• ثانياً‪ :‬مقارنة العنصر المراد البحث عنه (‪ )48‬مع قيمة‬


‫‪ ,mid‬فإذا كان أكبر من قيمة الـ‪ mid‬نقوم بالبحث بالجزء‬
‫العلوي من الـ‪ ,Array‬و العكس في حال كان أقل من ‪.mid‬‬
‫و ذلك لأن الـ‪ Array‬مرتب (‪ ,)sorted‬و قد يختلف حسب‬
‫إذا كان مرتب تصاعديا او تنازليا‪.‬‬

‫في مثالنا نقوم بمقارنة ‪ 48‬مع ‪ ,39‬و بما ان ‪ 48‬أكبر؛ فإننا‬


‫نبحث في الشق الأيمن من الـ‪.Array‬‬

‫الشق الأيمن (العلوي)‬

‫و نكرر الخطوات حتى نجد العنصر‪ ,‬و في حال عدم إيجاده‬


‫نقوم بإرجاع قيمة ‪.-1‬‬
Searching Algorithms
• Binary Search Code:

int bSearch(int A[], int item, int first, int last)


{
int middle;
while(first<=last)
{
middle = (first + last) / 2;
if( A[middle] == item )
return middle;
else if( item < A[middle] )
last = middle - 1;
else
first = middle + 1;
}

return -1;
}

‫ تتغير في حال كان‬last ‫ و‬first ‫لاحظ بإن قيمة‬


‫؛ و ذلك حتى نقوم بالتحرك‬mid ‫أكبر أو أصغر من‬
‫في الشق الأيمن أو الأيسر حسب العنصر الذي‬
.‫نقوم بالبحث عنه‬
Searching Algorithms
• Binary Search Code:

middle = (first + last) / 2; mid ‫حساب قيمة‬


if( A[middle] == item )
‫مقارنة العنصر المراد إيجاده‬
return middle; mid ‫بالعنصر الموجود في‬

First Last

else if( item < A[middle] )


last = middle - 1;
mid ‫مقارنة العنصر المراد إيجاده بالعنصر الموجود في‬

.‫ نقوم بالتحرك نحو الشق الايسر‬,mid ‫ أصغر من‬item ‫فإذا كان‬

First Last
Searching Algorithms
• Binary Search Code:

else
first = middle + 1;
.‫ نقوم بالتحرك نحو الشق الايمن‬,mid ‫ أكبر من‬item ‫فإذا كان‬

First Last

‫ فنعيد حساب قيمة‬,‫• و نكرر الخطوات مرة أخرى‬


‫ الجديدة مع العنصر‬mid ‫ و نقارن قيمة‬mid
.‫المراد إيجاده‬
:Array‫ في الـ‬45 ‫• مثلاً لإيجاد‬

int bSearch(int A[], int item, int first, int last) 1


{
int middle;
while(first<=last)
{
middle = (first + last) / 2;  middle = ( 0 + 11 ) / 2 = 5
if( A[middle] == item )  if( 39 == 45 ) = false
return middle;
Searching Algorithms
else if( item < A[middle] )  else if( 45 < 39 ) = false 2
last = middle - 1;
else  else ‫تنفيذ جملة‬
first = middle + 1; first ‫ إلى‬middle + 1 ‫إسناد‬
} .mid ‫ أصغر من‬item ‫؛ لأن‬

First Last

: ‫ مرة أخرى‬mid ‫نقوم بحساب‬ 3


middle = (first + last) / 2;  middle = ( 6 + 11 ) / 2 = 8
if( A[middle] == item )  if( 66 == 45 ) = false
return middle;

First Last
Mid

else if( item < A[middle] )  else if( 45 < 66 ) = true 4


last = middle - 1;

First Last
Mid
Searching Algorithms
: ‫ مرة أخرى‬mid ‫نقوم بحساب‬ 5
middle = (first + last) / 2;  middle = ( 6 + 7 ) / 2 = 6
if( A[middle] == item )  if( 45 == 45 ) = True
return middle;

‫ فنقوم بإرجاع قيمة‬,Array‫ في الـ‬45 ‫إيجاد العنصر‬


.45 ‫ و هي عبارة عن الاندكس الخاص بالعنصر‬middle First Last
)mid=6(
Mid

• Binary Search Code (RECURSIVE) :

int bSearch(int A[], int item, int first, int last)


{
if(first > last)
return -1;
else
{
int middle = (first + last)/2;
if(A[middle] == item)
return middle;
else if(A[middle] < item)
return bSearch(A, item, middle + 1, last);
else
return bSearch(A, item, first, middle - 1);
}
}
‫‪Searching Algorithms‬‬
‫مثال آخر ‪ :‬البحث عن العنصر ‪...22‬‬

‫مثال للبحث عن العنصر ‪...34‬‬

‫عدد المقارنات ‪Number of comparisons :‬‬

‫عبارة عن كل ‪Iteration : loop‬‬


‫‪Selection Sort‬‬
‫‪Selection Sort (Array-Based List) :‬‬
‫ترتيب الـ‪ List‬عن طريق‪:‬‬
‫• تحديد أصغر عنصر في الـ‪.list‬‬
‫• تحريك العنصر إلى أعلى الـ‪ .list‬وطريقة التحريك يكون ‪ swap‬بين‬
‫العنصر الأصغر الذي حددناه‪ ,‬و العنصر في أعلى الـ‪.List‬‬

‫لاحظ بأن الـ‪ list‬غير مرتب‪ .‬فنستخدم طريقة الـ‪Selection‬‬


‫لترتيبه‪...‬‬

‫أولا ً‪ :‬نحدد أصغر عنصر في‬


‫الـ‪ ,list‬و هو ‪.5‬‬

‫ثانياً‪ :‬نستبدل العنصرين‪ ,‬فبصبح العنصر‬


‫‪ 5‬في أعلى الـ‪ list‬و يصبح العنصر ‪16‬‬
‫في موقع العنصر ‪ 5‬الأصلية (الموقع ‪.)6‬‬
‫‪Selection Sort‬‬
‫و نكرر مرة أخرى‪...‬‬ ‫فيصبح الـ‪ list‬هكذا ‪:‬‬

‫بداية من الموقع ‪1‬‬


‫ً‬ ‫• نبحث عن أصغر عنصر‬
‫(العنصر الثاني)‪ .‬و أصغر عنصر هو ‪.7‬‬

‫• ثم نستبدل بين العنصرين ‪ 7‬و ‪: 30‬‬

‫و نكرر الخطوات حتى نحصل على‬


‫‪ List‬مرتب تصاعديا!‬

‫هكذا ‪:‬‬
‫]‪[0‬‬ ‫]‪[1‬‬ ‫]‪[2‬‬ ‫]‪[3‬‬ ‫]‪[4‬‬ ‫]‪[5‬‬ ‫]‪[6‬‬ ‫]‪[7‬‬
‫‪5‬‬ ‫‪7‬‬ ‫‪16‬‬ ‫‪24‬‬ ‫‪30‬‬ ‫‪45‬‬ ‫‪55‬‬ ‫‪62‬‬
‫‪Selection Sort‬‬
‫• كود لتحديد أصغر عنصر في الـ‪: list‬‬

‫• كود الـ‪Swap‬؛ لتحريك العناصر ‪:‬‬

‫• فنكشن الـ‪: Selection Sort‬‬


‫‪Insertion Sort‬‬
‫‪• Insertion Sort (Array-Based List) :‬‬
‫• خطوات ترتيب الـ‪: list‬‬
‫• نحدد أول عنصر يشكل خلل في ترتيب الـ‪.list‬‬
‫• إزاحة عناصر الـ‪ list‬؛لنقل العنصر إلى مكانه المناسب‪.‬‬

‫‪ -‬لاحظ بأن كل من المواقع (‪ )0,1,2,3‬مرتب تصاعديا ‪:‬‬

‫‪ -‬و لكن العنصر ‪( 23‬في الموقع ‪ )4‬ليس في مكانه الصحيح!‬


‫و علينا تحريكه إلى الموقع المناسب (في الموقع ‪.)2‬‬

‫• كيف سننقل ‪ 23‬إلى موقع ‪ 2‬؟‬


‫‪ -‬نحتاج إلى متغير مؤقت (‪)temp‬‬
‫و نخزن العنصر ‪ 23‬فيه‪.‬‬

‫‪ -‬ثم نطبق الإزاحة! و الإزاحة عبارة عن‬


‫إسناد (‪ )copy‬كل عنصر إلى العنصر‬
‫الذي يسبقه (باتجاه الأسفل)‪.‬‬
‫أي اننا نقوم بإزاحة كل من ‪ 25‬و ‪30‬‬
‫خطوة واحدة باتجاه الأسفل‪.‬‬
‫‪Insertion Sort‬‬

‫‪ -‬يصبح الـ ‪ list‬بهذا الشكل بعد الإزاحة ‪:‬‬

‫‪ -‬آخر خطوة هي إسناد العنصر ‪ 23‬المخزن في‬


‫المتغير ‪ ,temp‬إلى الموقع ‪: 2‬‬

‫فيصبح الـ‪ list‬هكذا بعد تكرار الخطوات ليصبح‬


‫مرتب تصاعديا ‪:‬‬
‫]‪[0‬‬ ‫]‪[1‬‬ ‫]‪[2‬‬ ‫]‪[3‬‬ ‫]‪[4‬‬ ‫]‪[5‬‬ ‫]‪[6‬‬ ‫]‪[7‬‬
‫‪10‬‬ ‫‪17‬‬ ‫‪18‬‬ ‫‪23‬‬ ‫‪25‬‬ ‫‪30‬‬ ‫‪35‬‬ ‫‪45‬‬
‫‪Insertion Sort‬‬

‫• سنحتاج إلى متغير ليخزن أندكس أول عنصر في‬


‫الـ ‪.unsorted list‬‬
‫• اسم المتغير ‪.firstOutOfOrder :‬‬

‫‪ -‬في المثال التالي‪ ,‬العنصر ‪ 7‬يشكل خلل في الترتيب‬


‫(الموجود في الموقع ‪ ,)1‬فيصبح قيمة المتغير ‪.1‬‬

‫‪ -‬نقل العنصر ‪ 7‬إلى ‪ temp‬و إزاحة العنصر ‪ 13‬إلى اليمين‪.‬‬


‫‪ -‬ثم نقل العنصر ‪ 7‬من ‪ temp‬إلى مكانه المناسب‪.‬‬

‫‪ -‬الشكل النهائي للـ ‪: list‬‬


‫]‪[0‬‬ ‫]‪[1‬‬ ‫]‪[2‬‬ ‫]‪[3‬‬ ‫]‪[4‬‬ ‫]‪[5‬‬ ‫]‪[6‬‬ ‫]‪[7‬‬
‫‪3‬‬ ‫‪7‬‬ ‫‪8‬‬ ‫‪12‬‬ ‫‪13‬‬ ‫‪15‬‬ ‫‪20‬‬ ‫‪30‬‬
‫‪Merge Sort‬‬
‫‪• Merge Sort :‬‬
‫• عبارة عن تقسيم الـ‪ list‬إلى أجزاء و ثم ترتيبها و‬
‫ثم دمجها معاً مرة أخرى‪.‬‬
‫• باستخدام طريقة اسمها (‪)divide and conquer‬‬

‫• الـ‪ list‬غير مرتب‪ ,‬فنقسمها! و لكن كيف؟‬


‫‪ -‬نقسمها من المنتصف‪ ,‬و نستمر في تقسيمها من‬
‫الوسط‪ ,‬حتى يتكون الـ‪ list‬من عنصر واحد‪.‬‬

‫‪ )1‬عملية التقسيم‪:‬‬
‫عند تقسيم الـ‪ list‬من‬
‫الوسط‪ ,‬يصبح لدي زوج‬
‫يتكون كم منهما من ‪4‬‬
‫عناصر‪.‬‬

‫عملية تقسيم اخرى؛ لأننا‬


‫لم نتوصل إلى ‪ List‬من‬
‫عنصر واحد لحد الآن‪.‬‬

‫الانتهاء من عملية التقسيم؛ لأننا وصلنا إلى ‪ List‬مكون من عنصر واحد‪.‬‬ ‫•‬
‫‪Merge Sort‬‬
‫‪ )2‬عملية الدمج‪:‬‬
‫‪ -‬أولاً نبدأ بالمقارنة بين القيم‪...‬‬
‫‪ -‬القيمة الأقل تكون في أول الـ‪ sub List‬و ندمج‬
‫القيمتين ‪:‬‬

‫‪ -‬ثم نقارن بين الـ‪ sub lists‬المكونة و نرتب من‬


‫الاقل للاكبر ‪:‬‬

‫‪ -‬نرتب من الاقل للاكبر ‪:‬‬

‫• الشكل النهائي للـ ‪ list‬المرتب بالـ(‪:)Merge sort‬‬


‫‪Merge Sort‬‬
‫• الرسمة كاملة‪:‬‬

‫جميع كودات ‪ Merge Sort‬هنا !‬

You might also like