محاور المحاضرة خوارزمية الفقاعات الهوائية (Bubble Sort) خوارزمية الاختيار للترتيب (Selection Sort) خوارزمية الإدراج للترتيب (Insertion Sort)
ما الهدف من خوارزميات الترتيب؟ تهدف خوارزميات الترتيب إلى العمل على ترتيب مجموعة من العناصر المخزنة ضمن أحد أشكال تراكيب البيانات, و الترتيب يتم بناءً على كيفية محددة فمثلا تصاعدي, تنازلي, أبجدي, ... و تتميز خوارزمية عن أخرى من خوارزميات الترتيب في مدى تعقيد الخوارزمية من حيث الوقت و المساحة التخزينية المطلوبة.
خوارزمية Bubble Sort تعتمد هذه الخوارزمية على مقارنة العناصر المتجاورة, مع بناءً على هذه المقارنة يتم عمل الترتيب سواء تصاعدي أو تنازلي. و هذا النوع من الخوارزميات نحتاج فيه إلى المرور على البيانات المخزنة بعدد مرات يساوي عدد العناصر المخزنة مطروحا منه واحد (n-1), و ذلك في أسوء الأحوال (ما المقصود بـ أسوء الأحوال؟) درجة تعقيد هذه الخوارزمية (Complexity) = О(n2) حيث أنَّ n هي عدد العناصر المراد ترتيبها.
الدورة الاولى الدورة الثانية
خوارزمية Bubble Sort مصدر الصورة http://vsmecollege.blogspot.com/2010/05/bubble-sort-bash-shell-programming-with.html
خوارزمية Bubble Sort for ( int pass = 1, pass < عدد العناصر, pass++ ) for ( int i = 0; i < عدد العناصر- 1; i++ ) if ( b[ i ] > b[ i + 1 ] ) Swap(b[ i ], b[ i +1] ); التكرار في السطر الأول نستخدمه لتكرار المرور على العناصر المراد ترتيبها. التكرار في السطر الثاني يستخدم لتكرار فحص كل عنصرين متجاورين, و هذا يتم في كل دوران.
خوارزمية Bubble Sort على المصفوفة static void Main(string[] args) { int[] id = { 12, 30, 1, 4, 7, 2 }; Console.Write(" Elements of Array Before Sorting "); for (int x = 0; x < id.Length; x++) Console.Write(" " + id[x]); Console.WriteLine(" "); for (int i =0; i< id.Length; i++) for (int j =0; j< id.Length-1; j++) if (id[j] > id[j + 1]) int hold = id[j]; id[j] = id[j + 1]; id[j + 1] = hold; } Console.Write(" Elements of Array After Sorting "); Console.Write(" "+id[x]); } ترتيب المصفوفة تصاعديـا في حال رغبنا في تنازليا سنقوم بعكس شرط الفحص في السطر رقم 10 ليصبح if (id[j] < id[j + 1])
خوارزمية Selection Sort تعتمد هذه الخوارزمية على البحث عن أصغر عنصر تالي, يتم وضعه في ترتيبه المناسب. ففي كل دورة من دورات التكرار يتم البحث عن أصغر عنصر فيما تبقى من المصفوفة, و عند العثور عليه يتم عمل استبدال swap بينه و بين العنصر الموجود في الموضع صاحب رقم الدورة و هكذا حتى نحصل على عناصر مرتبة. درجة تعقيد هذه الخوارزمية (Complexity) = О(n2) حيث أنَّ n هي عدد العناصر المراد ترتيبها.
خوارزمية Selection Sort
خوارزمية Selection Sort static void Main(string[] args) { int[] a = { 10, 2, 34, 4, 3, 1, 100 }; int hold; for (int i = 0; i < a.Length; i++) { for (int j = i + 1; j < a.Length; j++) if (a[j] < a[i]) { hold = a[j]; a[j] = a[i]; a[i] = hold; } } for (int k = 0; k < a.Length; k++) Console.WriteLine(a[k]); Console.Read(); }
خوارزمية Insertion Sort خوارزمية الإدراج, هي الطريقة النمطية التي يستخدمها الناس لترتيب أشياءهم, فهي تعتمد على جمع العناصر المراد ترتيبها, ثم نبدأ في أخذ العناصر واحدا تلو الآخر و نضعه في ترتيبه المناسب, و هكذا حتى نصل إلى الترتيب النهائي. ملاحظـة/ العنصر الأول لا يتم تغيير موضعه إلا بعد الدورة الأولى على الأقل, بينما في البداية فهو يعتبر الوحيد و بالتالي موضعه مناسب, و يتم تحريكه فقط إن ظهر عنصر فيما بعد أصغر منه. درجة تعقيد هذه الخوارزمية (Complexity) = О(n2) حيث أنَّ n هي عدد العناصر المراد ترتيبها.
خوارزمية Insertion Sort مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا
خوارزمية Insertion Sort المصدر: وكيبيديا
خوارزمية Insertion Sort مع المصفوفة static void Main(string[] args) { int[] a = { 10, 2, 34, 4, 3, 1, 100 }; int inner, temp; for (int outer = 1; outer < a.Length; outer++) { temp = a[outer]; inner = outer; while (inner > 0 && a[inner - 1] >= temp) a[inner] = a[inner - 1]; inner = inner -1; } a[inner] = temp; } Console.WriteLine(); for (int k = 0; k < a.Length; k++) Console.WriteLine(" " + a[k]); Console.Read(); }
مقارنة درجة التعقيد للخوارزميات الثلاث Bubble: #Compares: O(n2) #Swaps: O(n2) Selection: #Swaps: O(n) Insertion #Shifts: O(n2)
Sorting Algorithms Animation https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html