الترتيب الفقاعي
آخر تحديث
يمر الترتيب الفقاعي عبر القائمة مرارًا وتكرارًا، ويقارن كل زوج من العناصر المتجاورة، ويبدّل بينهما إذا كانا في الترتيب الخاطئ. بعد كل تمريرة كاملة تكون أكبر قيمة متبقية قد "طفت" إلى موضعها الصحيح في النهاية، لذا تنظر كل تمريرة إلى عنصر أقل. اضغط تشغيل في الأعلى لمشاهدة المقارنات وعمليات التبديل، أو تنقّل بينها خطوة واحدة في كل مرة.
إنها إحدى أبسط خوارزميات الترتيب فهمًا، ما يجعلها خوارزمية أولى رائعة، لكن زمن تشغيلها O(n²) يجعلها غير عملية للمدخلات الكبيرة.
التعقيد الزمني والمكاني
| الحالة | التعقيد | ملاحظات |
|---|---|---|
| أفضل حالة | O(n) | مرتبة مسبقًا، مع فحص الخروج المبكر |
| الحالة المتوسطة | O(n²) | ترتيب عشوائي |
| أسوأ حالة | O(n²) | مرتبة بترتيب عكسي |
| المساحة | O(1) | في المكان، متغير مؤقت واحد فقط |
| مستقرة | نعم | تحتفظ العناصر المتساوية بترتيبها النسبي |
خطوة بخطوة
| الخطوة | ما الذي يحدث |
|---|---|
| 1 | ابدأ من بداية المصفوفة. |
| 2 | قارن العنصر الحالي بالعنصر التالي. |
| 3 | إذا كانا في ترتيب خاطئ، بدّل بينهما. |
| 4 | تحرك موضعًا واحدًا إلى اليمين وكرر حتى النهاية (تمريرة واحدة). |
| 5 | كرر التمريرات؛ كل تمريرة تثبّت عنصرًا إضافيًا في النهاية. |
| 6 | توقف عندما لا تُجري تمريرة كاملة أي عملية تبديل. |
مثال محلول
ترتيب [5, 2, 4, 1]:
| التمريرة | المصفوفة | الإجراء |
|---|---|---|
| 1 | [2, 4, 1, 5] | بدّل 5,2، ثم 5,4، ثم 5,1؛ يطفو 5 إلى النهاية. |
| 2 | [2, 1, 4, 5] | 2,4 بالترتيب الصحيح؛ بدّل 4,1؛ 4,5 بالترتيب الصحيح؛ استقر 4 الآن. |
| 3 | [1, 2, 4, 5] | بدّل 2,1؛ البقية بالترتيب الصحيح مسبقًا؛ استقر 2. |
| 4 | [1, 2, 4, 5] | لا تُجري تمريرة كاملة أي تبديل، لذا فالمصفوفة مرتبة وتتوقف الخوارزمية. |
متى تستخدم الترتيب الفقاعي
| استخدمه عندما | تجنّبه عندما |
|---|---|
| تُعلّم أو تتعلم كيف تعمل خوارزميات الترتيب القائمة على المقارنة | ترتّب مدخلات كبيرة، حيث يكون O(n²) بطيئًا جدًا |
يكون المدخل صغيرًا جدًا أو شبه مرتب (مع الخروج المبكر يقترب من O(n)) | تحتاج إلى أسرع ترتيب عام الغرض — استخدم quicksort أو merge sort |
| تريد ترتيبًا مستقرًا في المكان بشيفرة شبه معدومة | تكون البيانات بترتيب عشوائي والأداء مهم |
| تكتشف في تمريرة واحدة ما إذا كانت قائمة قصيرة مرتبة مسبقًا | تكون عمليات الكتابة الكثيرة مكلفة (مثل ذاكرة فلاش)؛ يُجري ترتيب الاختيار عمليات تبديل أقل |
كود Bubble Sort
تنفيذ نظيف وقابل للتشغيل لخوارزمية Bubble Sort بلغات Python, JavaScript, Java, C++, C. اختر لغة، وانسخ الكود، أو افتحه محمّلًا مسبقًا في ساحة تجربة Coddy.
كود Bubble Sort بلغة Python
1def bubble_sort(a):2 n = len(a)3 for i in range(n - 1):4 swapped = False5 for j in range(n - 1 - i):6 if a[j] > a[j + 1]:7 a[j], a[j + 1] = a[j + 1], a[j]8 swapped = True9 if not swapped:10 break # no swaps means the list is already sorted11 return a12
13
14nums = [5, 1, 4, 2, 8]15print("Before:", nums)16bubble_sort(nums)17print("After: ", nums)كود Bubble Sort بلغة JavaScript
1function bubbleSort(a) {2 for (let end = a.length - 1; end > 0; end--) {3 let swapped = false;4 for (let j = 0; j < end; j++) {5 if (a[j] > a[j + 1]) {6 [a[j], a[j + 1]] = [a[j + 1], a[j]];7 swapped = true;8 }9 }10 if (!swapped) break; // Already sorted: stop early11 }12 return a;13}14
15const data = [5, 2, 9, 1, 7, 3];16console.log("Before:", data);17console.log("Sorted:", bubbleSort([...data]));كود Bubble Sort بلغة Java
1import java.util.Arrays;2
3public class Main {4 static void bubbleSort(int[] arr) {5 for (int i = arr.length - 1; i > 0; i--) {6 boolean swapped = false;7 for (int j = 0; j < i; j++) {8 if (arr[j] > arr[j + 1]) {9 int tmp = arr[j];10 arr[j] = arr[j + 1];11 arr[j + 1] = tmp;12 swapped = true;13 }14 }15 if (!swapped) break; // already sorted16 }17 }18
19 public static void main(String[] args) {20 int[] arr = {5, 1, 4, 2, 8, 3};21 System.out.println("Before: " + Arrays.toString(arr));22 bubbleSort(arr);23 System.out.println("After: " + Arrays.toString(arr));24 }25}كود Bubble Sort بلغة C++
1#include <iostream>2#include <utility>3#include <vector>4
5void printVec(const std::vector<int>& a) {6 for (int x : a) std::cout << x << " ";7 std::cout << "\n";8}9
10void bubbleSort(std::vector<int>& a) {11 for (size_t pass = 0; pass + 1 < a.size(); ++pass) {12 bool swapped = false;13 // Each pass bubbles the largest remaining value to the end14 for (size_t j = 0; j + 1 < a.size() - pass; ++j) {15 if (a[j] > a[j + 1]) {16 std::swap(a[j], a[j + 1]);17 swapped = true;18 }19 }20 if (!swapped) break; // already sorted21 }22}23
24int main() {25 std::vector<int> data = {5, 1, 4, 2, 8, 3};26 std::cout << "Before: ";27 printVec(data);28 bubbleSort(data);29 std::cout << "After: ";30 printVec(data);31 return 0;32}كود Bubble Sort بلغة C
1#include <stdbool.h>2#include <stdio.h>3
4void printArr(const int a[], int n) {5 for (int i = 0; i < n; i++) printf("%d ", a[i]);6 printf("\n");7}8
9void bubbleSort(int a[], int n) {10 for (int pass = 0; pass < n - 1; pass++) {11 bool swapped = false;12 // Each pass bubbles the largest remaining value to the end13 for (int j = 0; j < n - 1 - pass; j++) {14 if (a[j] > a[j + 1]) {15 int tmp = a[j];16 a[j] = a[j + 1];17 a[j + 1] = tmp;18 swapped = true;19 }20 }21 if (!swapped) break; // already sorted22 }23}24
25int main(void) {26 int data[] = {5, 1, 4, 2, 8, 3};27 int n = sizeof(data) / sizeof(data[0]);28 printf("Before: ");29 printArr(data, n);30 bubbleSort(data, n);31 printf("After: ");32 printArr(data, n);33 return 0;34}الأسئلة الشائعة حول الترتيب الفقاعي
ما هو التعقيد الزمني للترتيب الفقاعي؟
O(n²) في الحالتين المتوسطة والأسوأ بسبب الحلقات المتداخلة. مع تحسين الخروج المبكر يمكنه بلوغ O(n) على مصفوفة مرتبة مسبقًا. ويستخدم مساحة إضافية قدرها O(1).هل الترتيب الفقاعي مستقر؟
لماذا يُسمى الترتيب الفقاعي؟
ما الفرق بين الترتيب الفقاعي وترتيب الإدراج؟
O(n²) وهما مستقران وفي المكان، لكنهما يحركان البيانات بطريقة مختلفة: يبدّل الترتيب الفقاعي مرارًا الأزواج المتجاورة غير المرتبة، بينما يأخذ ترتيب الإدراج كل عنصر ويزلقه إلى موضعه الصحيح داخل البادئة المرتبة. عادةً ما يُجري ترتيب الإدراج عمليات كتابة أقل ويكون أسرع عمليًا، خصوصًا على البيانات شبه المرتبة.متى ينبغي أن أستخدم الترتيب الفقاعي بدلاً من quicksort؟
O(n log n) لـ quicksort يسحق O(n²) للترتيب الفقاعي في كل شيء عدا المدخلات الصغيرة جدًا. لا يستحق الترتيب الفقاعي الاستخدام إلا عندما تكون القائمة صغيرة جدًا أو شبه مرتبة، أو عندما تريد أبسط ترتيب مستقر ممكن لأغراض التعليم.هل يغيّر تحسين الخروج المبكر أسوأ حالة للترتيب الفقاعي؟
O(n) على مدخل مرتب مسبقًا، لكن مصفوفة مرتبة عكسيًا لا تزال تحتاج إلى كل المقارنات، لذا تبقى أسوأ حالة O(n²). لا يساعد هذا التحسين إلا في أفضل حالة والحالات شبه المرتبة.