مرتب سازی حبابی و پیاده سازی آن — از صفر تا صد

۸۶۰۹ بازدید
آخرین به‌روزرسانی: ۱۷ اردیبهشت ۱۴۰۲
زمان مطالعه: ۹ دقیقه
مرتب سازی حبابی و پیاده سازی آن — از صفر تا صد

«مرتب‌سازی حبابی» (Bubble Sort)، یکی از انواع الگوریتم‌های مرتب‌سازی محسوب می‌شود. این الگوریتم مرتب‌سازی از جمله الگوریتم‌های مبتنی بر مقایسه است که در آن، جفت عنصرهای هم‌جوار با یکدیگر مقایسه شده و در صورتی که دارای ترتیب صحیحی نباشند، با یکدیگر جا به جا می‌شوند. الگوریتم مرتب سازی حبابی برای مجموعه داده‌های بزرگ مناسب نیست، زیرا پیچیدگی زمانی آن در حالت میانگین و بدترین حالت برابر با (Ο(n2 است، که در آن n تعداد کل عناصر مجموعه داده محسوب می‌شود. در این مطلب، ابتدا یک مثال از الگوریتم مرتب‌سازی حبابی ارائه و سپس، «روندنما» (Flow Chart)، شبه کد و پیاده‌سازی آن در زبان‌های «پایتون» (Python)، «جاوا» (Java)، «سی» (C) و «سی‌پلاس‌پلاس» (++C)، «پی‌اچ‌پی» (PHP) و «سی‌شارپ» (#C) ارائه شده است. شایان توجه است که الگوریتم‌های مرتب‌سازی از جمله مباحث بسیار مهم در «ساختمان داده» (Data Structure) هستند.

الگوریتم مرتب سازی حبابی چطور کار می‌کند؟

برای تشریح چگونگی عملکرد الگوریتم مرتب سازی حبابی، از یک مثال استفاده شده است. در این مثال، یک آرایه غیر مرتب در نظر گرفته شده است. با توجه به اینکه الگوریتم مرتب سازی حبابی از مرتبه (Ο(n2 است، آرایه انتخاب شده کوچک در نظر گرفته می‌شود.

آرایه در نظر گرفته شده: ( ۴ ۲ ۸ ۱ ۵ ) است. مرتب‌سازی حبابی برای این آرایه، به صورت زیر انجام می‌شود.

۱. ابتدا، دو عنصر اول آرایه با یکدیگر مقایسه می‌شوند و با توجه به آنکه ۵ از ۱ بزرگتر است (۱<۵)، این دو عنصر با یکدیگر جا به جا می‌شوند.

5 1 4 2 8 ) –> ( 1 5 4 2 8 )

۲. در اینجا، عناصر دوم و سوم آرایه مقایسه می‌شوند و با توجه به اینکه ۵ از ۴ بزرگ‌تر است (۴<۵)، این دو عنصر با یکدیگر جا به جا می‌شوند.

( 1 5 4 2 8 ) –> ( 1 4 5 2 8 )

۳. اکنون، عنصر سوم و چهارم آرایه مقایسه می‌شوند و با توجه به اینکه ۲ از ۵ کوچک‌تر است (۲<۵)، این دو عنصر با یکدیگر جا به جا می‌شوند.

( 1 4 5 2 8 ) –>  ( 1 4 2 5 8 )

۴. در اینجا، عنصر چهارم و پنجم آرایه مقایسه می‌شود و چون ۵ از ۸ کوچک‌تر است (۵<۸) دو عنصر در جای خود بدون هر گونه جا به جایی باقی می‌مانند؛ چون در واقع، ترتیب (صعودی) در آن‌ها رعایت شده است.

( 1 4 2 5 8 ) –> ( 1 4 2 5 8 )

اکنون یک دور کامل در آرایه زده شد. دومین دور نیز به شیوه بیان شده در بالا انجام می‌شود.

۱. جا به جایی اتفاق نمی‌افتد.

1 4 2 5 8 ) –> ( 1 4 2 5 8 )

۲. با توجه به بزرگ‌تر بودن ۴ از ۲ (۲<۴)، این دو عنصر با یکدیگر جا به جا می‌شوند.

( 1 4 2 5 8 ) –> ( 1 2 4 5 8 )

۳. جا به جایی اتفاق نمی‌افتد.

( 1 2 4 5 8 ) –> ( 1 2 4 5 8 )

۴. جا به جایی اتفاق نمی‌افتد.

( 1 2 4 5 8 ) –>  ( 1 2 4 5 8 )

در حال حاضر، آرایه مرتب شده است، اما الگوریتم نمی‌داند که آیا کار به پایان رسیده یا خیر؛ بنابراین، به یک دور کامل دیگر بدون انجام هرگونه جا به جایی نیاز دارد تا بفهمد که مرتب‌سازی با موفقیت به پایان رسیده است.

1 2 4 5 8 ) –> ( 1 2 4 5 8 )
( 1 2 4 5 8 ) –> ( 1 2 4 5 8 )
( 1 2 4 5 8 ) –> ( 1 2 4 5 8 )
( 1 2 4 5 8 ) –> ( 1 2 4 5 8 )

مرتب سازی حبابی
فلوچارت الگوریتم مرتب‌سازی حبابی

شبه کد الگوریتم مرتب سازی حبابی

1Bubble Sort(a[],n)
2	For i=0 to n-1
3	Swap=false
4	For j=i+1 to n
5		if a[j-1] >a[j]
6			Swap(a[j-1],a[j])
7			Swap=true
8		Break if not swapped

در ادامه، پیاده‌سازی الگوریتم مرتب سازی حبابی در زبان‌های برنامه‌نویسی گوناگون انجام شده و آرایه {۹۰ ,۱۱ ,۲۲ ,12 ,۲۵ ,۳۴ ,۶۴} به عنوان ورودی به قطعه کدها داده شده است. بنابراین، خروجی نهایی همه قطعه کدها، به صورت زیر خواهد بود.

11 12 22 25 34 64 90

پیاده‌سازی الگوریتم مرتب سازی حبابی در پایتون

در این بخش پیاده‌سازی الگوریتم مرتب سازی حبابی با زبان برنامه نویسی پایتون را بررسی می‌کنیم.

1# Python program for implementation of Bubble Sort 
2  
3def bubbleSort(arr): 
4    n = len(arr) 
5  
6    # Traverse through all array elements 
7    for i in range(n): 
8  
9        # Last i elements are already in place 
10        for j in range(0, n-i-1): 
11  
12            # traverse the array from 0 to n-i-1 
13            # Swap if the element found is greater 
14            # than the next element 
15            if arr[j] > arr[j+1] : 
16                arr[j], arr[j+1] = arr[j+1], arr[j] 
17  
18# Driver code to test above 
19arr = [64, 34, 25, 12, 22, 11, 90] 
20  
21bubbleSort(arr) 
22  
23print ("Sorted array is:") 
24for i in range(len(arr)): 
25    print ("%d" %arr[i]),

پیاده‌سازی الگوریتم مرتب سازی حبابی در جاوا

در ادامه پیاده‌سازی الگوریتم مرتب سازی حبابی در زبان جاوا را مشاهده می‌کنیم.

1// Java program for implementation of Bubble Sort 
2class BubbleSort 
3{ 
4    void bubbleSort(int arr[]) 
5    { 
6        int n = arr.length; 
7        for (int i = 0; i < n-1; i++) 
8            for (int j = 0; j < n-i-1; j++) 
9                if (arr[j] > arr[j+1]) 
10                { 
11                    // swap arr[j+1] and arr[i] 
12                    int temp = arr[j]; 
13                    arr[j] = arr[j+1]; 
14                    arr[j+1] = temp; 
15                } 
16    } 
17  
18    /* Prints the array */
19    void printArray(int arr[]) 
20    { 
21        int n = arr.length; 
22        for (int i=0; i<n; ++i) 
23            System.out.print(arr[i] + " "); 
24        System.out.println(); 
25    } 
26  
27    // Driver method to test above 
28    public static void main(String args[]) 
29    { 
30        BubbleSort ob = new BubbleSort(); 
31        int arr[] = {64, 34, 25, 12, 22, 11, 90}; 
32        ob.bubbleSort(arr); 
33        System.out.println("Sorted array"); 
34        ob.printArray(arr); 
35    } 
36} 
37/* This code is contributed by Rajat Mishra */

پیاده‌سازی الگوریتم مرتب سازی حبابی در C و ++C

1// C program for implementation of Bubble sort 
2#include <stdio.h> 
3  
4void swap(int *xp, int *yp) 
5{ 
6    int temp = *xp; 
7    *xp = *yp; 
8    *yp = temp; 
9} 
10  
11// A function to implement bubble sort 
12void bubbleSort(int arr[], int n) 
13{ 
14   int i, j; 
15   for (i = 0; i < n-1; i++)       
16  
17       // Last i elements are already in place    
18       for (j = 0; j < n-i-1; j++)  
19           if (arr[j] > arr[j+1]) 
20              swap(&arr[j], &arr[j+1]); 
21} 
22  
23/* Function to print an array */
24void printArray(int arr[], int size) 
25{ 
26    int i; 
27    for (i=0; i < size; i++) 
28        printf("%d ", arr[i]); 
29    printf("n"); 
30} 
31  
32// Driver program to test above functions 
33int main() 
34{ 
35    int arr[] = {64, 34, 25, 12, 22, 11, 90}; 
36    int n = sizeof(arr)/sizeof(arr[0]); 
37    bubbleSort(arr, n); 
38    printf("Sorted array: \n"); 
39    printArray(arr, n); 
40    return 0; 
41}

پیاده‌سازی الگوریتم مرتب سازی حبابی در PHP

1<?php  
2// PHP program for implementation  
3// of Bubble Sort 
4  
5function bubbleSort(&$arr) 
6{ 
7    $n = sizeof($arr); 
8  
9    // Traverse through all array elements 
10    for($i = 0; $i < $n; $i++)  
11    { 
12        // Last i elements are already in place 
13        for ($j = 0; $j < $n - $i - 1; $j++)  
14        { 
15            // traverse the array from 0 to n-i-1 
16            // Swap if the element found is greater 
17            // than the next element 
18            if ($arr[$j] > $arr[$j+1]) 
19            { 
20                $t = $arr[$j]; 
21                $arr[$j] = $arr[$j+1]; 
22                $arr[$j+1] = $t; 
23            } 
24        } 
25    } 
26} 
27  
28// Driver code to test above 
29$arr = array(64, 34, 25, 12, 22, 11, 90); 
30  
31$len = sizeof($arr); 
32bubbleSort($arr); 
33  
34echo "Sorted array : \n"; 
35  
36for ($i = 0; $i < $len; $i++) 
37    echo $arr[$i]." ";  
38  
39// This code is contributed by ChitraNayal. 
40?>

پیاده‌سازی الگوریتم مرتب سازی حبابی در سی شارپ

در این بخش پیاده‌سازی الگوریتم مرتب سازی حبابی در زبان سی شارپ را برررسی می‌کنیم.

1// C# program for implementation  
2// of Bubble Sort 
3using System; 
4  
5class GFG 
6{  
7    static void bubbleSort(int []arr) 
8    { 
9        int n = arr.Length; 
10        for (int i = 0; i < n - 1; i++) 
11            for (int j = 0; j < n - i - 1; j++) 
12                if (arr[j] > arr[j + 1]) 
13                { 
14                    // swap temp and arr[i] 
15                    int temp = arr[j]; 
16                    arr[j] = arr[j + 1]; 
17                    arr[j + 1] = temp; 
18                } 
19    } 
20  
21    /* Prints the array */
22    static void printArray(int []arr) 
23    { 
24        int n = arr.Length; 
25        for (int i = 0; i < n; ++i) 
26            Console.Write(arr[i] + " "); 
27        Console.WriteLine(); 
28    } 
29  
30    // Driver method 
31    public static void Main() 
32    { 
33        int []arr = {64, 34, 25, 12, 22, 11, 90}; 
34        bubbleSort(arr); 
35        Console.WriteLine("Sorted array"); 
36        printArray(arr); 
37    } 
38  
39} 
40  
41// This code is contributed by Sam007

پیاده سازی بهینه الگوریتم مرتب سازی حبابی

تابع معرفی شده در بالا در حالت متوسط و بدترین حالت، برابر با (O(n*n است. بدترین حالت تنها هنگامی به وقوع می‌پیوندد که آرایه به ترتیب معکوسی مرتب شده باشد. پیچیدگی زمانی تابع مذکور در بهترین حالت برابر با (O(n است و این حالت تنها هنگامی اتفاق می‌افتد که آرایه مرتب شده باشد.

تابع بالا را می‌توان به این شکل بهینه کرد که اگر حلقه داخلی منجر به هیچ جا به جایی نشود، فرایند متوقف شود. در ادامه، نمونه کد مربوط به تابع بهینه شده، در زبان‌های برنامه‌نویسی گوناگون از جمله پایتون (نسخه ۳) ارائه شده است.

پیاده‌سازی بهینه الگوریتم مرتب سازی حبابی در پایتون

1# Python3 Optimized implementation 
2# of Bubble sort 
3  
4# An optimized version of Bubble Sort 
5def bubbleSort(arr): 
6    n = len(arr) 
7   
8    # Traverse through all array elements 
9    for i in range(n): 
10        swapped = False
11  
12        # Last i elements are already 
13        #  in place 
14        for j in range(0, n-i-1): 
15   
16            # traverse the array from 0 to 
17            # n-i-1. Swap if the element  
18            # found is greater than the 
19            # next element 
20            if arr[j] > arr[j+1] : 
21                arr[j], arr[j+1] = arr[j+1], arr[j] 
22                swapped = True
23  
24        # IF no two elements were swapped 
25        # by inner loop, then break 
26        if swapped == False: 
27            break
28           
29# Driver code to test above 
30arr = [64, 34, 25, 12, 22, 11, 90] 
31   
32bubbleSort(arr) 
33   
34print ("Sorted array :") 
35for i in range(len(arr)): 
36    print ("%d" %arr[i],end=" ") 
37  
38# This code is contributed by Shreyanshi Arun

پیاده‌سازی بهینه الگوریتم مرتب سازی حبابی در جاوا

1// Optimized java implementation 
2// of Bubble sort 
3import java.io.*; 
4  
5class GFG  
6{ 
7    // An optimized version of Bubble Sort 
8    static void bubbleSort(int arr[], int n) 
9    { 
10        int i, j, temp; 
11        boolean swapped; 
12        for (i = 0; i < n - 1; i++)  
13        { 
14            swapped = false; 
15            for (j = 0; j < n - i - 1; j++)  
16            { 
17                if (arr[j] > arr[j + 1])  
18                { 
19                    // swap arr[j] and arr[j+1] 
20                    temp = arr[j]; 
21                    arr[j] = arr[j + 1]; 
22                    arr[j + 1] = temp; 
23                    swapped = true; 
24                } 
25            } 
26  
27            // IF no two elements were  
28            // swapped by inner loop, then break 
29            if (swapped == false) 
30                break; 
31        } 
32    } 
33  
34    // Function to print an array  
35    static void printArray(int arr[], int size) 
36    { 
37        int i; 
38        for (i = 0; i < size; i++) 
39            System.out.print(arr[i] + " "); 
40        System.out.println(); 
41    } 
42  
43    // Driver program 
44    public static void main(String args[]) 
45    { 
46        int arr[] = { 64, 34, 25, 12, 22, 11, 90 }; 
47        int n = arr.length; 
48        bubbleSort(arr, n); 
49        System.out.println("Sorted array: "); 
50        printArray(arr, n); 
51    } 
52} 
53  
54  
55// This code is contributed  
56// by Nikita Tiwari.

پیاده‌سازی بهینه الگوریتم مرتب سازی حبابی در ++C

1// Optimized implementation of Bubble sort 
2#include <stdio.h> 
3  
4void swap(int *xp, int *yp) 
5{ 
6    int temp = *xp; 
7    *xp = *yp; 
8    *yp = temp; 
9} 
10  
11// An optimized version of Bubble Sort 
12void bubbleSort(int arr[], int n) 
13{ 
14   int i, j; 
15   bool swapped; 
16   for (i = 0; i < n-1; i++) 
17   { 
18     swapped = false; 
19     for (j = 0; j < n-i-1; j++) 
20     { 
21        if (arr[j] > arr[j+1]) 
22        { 
23           swap(&arr[j], &arr[j+1]); 
24           swapped = true; 
25        } 
26     } 
27  
28     // IF no two elements were swapped by inner loop, then break 
29     if (swapped == false) 
30        break; 
31   } 
32} 
33  
34/* Function to print an array */
35void printArray(int arr[], int size) 
36{ 
37    int i; 
38    for (i=0; i < size; i++) 
39        printf("%d ", arr[i]); 
40    printf("n"); 
41} 
42  
43// Driver program to test above functions 
44int main() 
45{ 
46    int arr[] = {64, 34, 25, 12, 22, 11, 90}; 
47    int n = sizeof(arr)/sizeof(arr[0]); 
48    bubbleSort(arr, n); 
49    printf("Sorted array: \n"); 
50    printArray(arr, n); 
51    return 0; 
52}

پیاده‌سازی بهینه الگوریتم مرتب سازی حبابی در PHP

1<?php  
2// PHP Optimized implementation 
3// of Bubble sort 
4  
5// An optimized version of Bubble Sort 
6function bubbleSort(&$arr) 
7{ 
8    $n = sizeof($arr); 
9  
10    // Traverse through all array elements 
11    for($i = 0; $i < $n; $i++) 
12    { 
13        $swapped = False; 
14  
15        // Last i elements are already 
16        // in place 
17        for ($j = 0; $j < $n - $i - 1; $j++) 
18        { 
19              
20            // traverse the array from 0 to 
21            // n-i-1. Swap if the element  
22            // found is greater than the 
23            // next element 
24            if ($arr[$j] > $arr[$j+1]) 
25            { 
26                $t = $arr[$j]; 
27                $arr[$j] = $arr[$j+1]; 
28                $arr[$j+1] = $t; 
29                $swapped = True; 
30            } 
31        } 
32  
33        // IF no two elements were swapped 
34        // by inner loop, then break 
35        if ($swapped == False) 
36            break; 
37    } 
38} 
39          
40// Driver code to test above 
41$arr = array(64, 34, 25, 12, 22, 11, 90);  
42$len = sizeof($arr); 
43bubbleSort($arr); 
44  
45echo "Sorted array : \n"; 
46  
47for($i = 0; $i < $len; $i++) 
48    echo $arr[$i]." "; 
49      
50// This code is contributed by ChitraNayal. 
51?>

پیاده‌سازی بهینه الگوریتم مرتب سازی حبابی در #C

1// Optimized C# implementation 
2// of Bubble sort 
3using System; 
4  
5class GFG 
6{  
7    // An optimized version of Bubble Sort 
8    static void bubbleSort(int []arr, int n) 
9    { 
10        int i, j, temp; 
11        bool swapped; 
12        for (i = 0; i < n - 1; i++)  
13        { 
14            swapped = false; 
15            for (j = 0; j < n - i - 1; j++)  
16            { 
17                if (arr[j] > arr[j + 1])  
18                { 
19                    // swap arr[j] and arr[j+1] 
20                    temp = arr[j]; 
21                    arr[j] = arr[j + 1]; 
22                    arr[j + 1] = temp; 
23                    swapped = true; 
24                } 
25            } 
26  
27            // IF no two elements were  
28            // swapped by inner loop, then break 
29            if (swapped == false) 
30                break; 
31        } 
32    } 
33  
34    // Function to print an array  
35    static void printArray(int []arr, int size) 
36    { 
37        int i; 
38        for (i = 0; i < size; i++) 
39            Console.Write(arr[i] + " "); 
40        Console.WriteLine(); 
41    } 
42  
43    // Driver method  
44    public static void Main() 
45    { 
46        int []arr = {64, 34, 25, 12, 22, 11, 90}; 
47        int n = arr.Length; 
48        bubbleSort(arr,n); 
49        Console.WriteLine("Sorted array"); 
50        printArray(arr,n); 
51    } 
52  
53} 
54// This code is contributed by Sam007

جمع‌بندی

الگوریتم مرتب‌سازی حبابی با توجه به سادگی که دارد، معمولا برای معرفی مفهوم مرتب‌سازی مورد استفاده قرار می‌گیرد. در گرافیک کامپیوتری، این الگوریتم مرتب‌سازی با توجه به توانایی که برای تشخیص خطاهای خیلی کوچک (مانند جا به جایی تنها دو عنصر) در آرایه‌های تقریبا مرتب شده و رفع آن با پیچیدگی خطی (2n) دارد، از محبوبیت زیادی برخوردار است.

برای مثال، در الگوریتم «پر کردن چند ضلعی» (Polygon Filling Algorithm) که خط‌های محدود کننده به وسیله مختصات x در یک خط اسکن مشخص مرتب‌سازی شده‌اند (خطی موازی محور x) و با افزایش y ترتیب آن‌ها در تقاطع دو خط تغییر می‌کند (دو عنصر جا به جا می‌شوند)، مورد استفاده قرار می‌گیرد.

^^

بر اساس رای ۳۲ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
Geeksforgeeks
۵ دیدگاه برای «مرتب سازی حبابی و پیاده سازی آن — از صفر تا صد»

با سلام
خسته نباشید
میشه این سوال رو جواب بدین
الگوریتم مرتب سازی حبابی را به گونه ای اصلاح شود که به شانس بستگی داشته باشد
ممنون

شبه کد و توضیحات اشتباه هستند همونطور که توی کد های کپی شده از سایت های دیگه مشخصه لوپ داخلی می بایست تا arr.length – i – 1 باشه نه تا arr.length – 1

با سلام و احترام؛

صمیمانه از همراهی شما با مجله فرادرس و ارائه بازخورد سپاس‌گزاریم.

با توجه به اینکه اندیس‌دهی در کدهای داخل حلقه تودرتو متفاوت است، شرط حلقه داخلی هم در شبه‌کد مربوطه با نمونه‌های مشابه فرق دارد. مشکل خاصی در عملکرد این شبه‌کد مشاهده نمی‌شود. در صورت وجود مشکل در کدها و همچنین توضیحات، لطفاً مشکل را دقیق‌تر شرح بدهید تا امکان بررسی بیش‌تر وجود داشته باشد.

برای شما آرزوی سلامتی و موفقیت داریم.

سلام خسته نباشید
چیکار باید بکنیم که بجای اینکه چنتا عدد بدیم مرتب کنه اعداد نامحدود باشه؟

اصلا این حرکت منطقی نیست وقتی اعداد نا محدود باشه مرتب سازی تا بی نهایت ادامه پیدا میکنه و الگوریتمی که پایان نداشته باشه غلطه

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *