مرتب سازی حبابی و پیاده سازی آن — از صفر تا صد
«مرتبسازی حبابی» (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 ترتیب آنها در تقاطع دو خط تغییر میکند (دو عنصر جا به جا میشوند)، مورد استفاده قرار میگیرد.
- مجموعه آموزشهای ساختمان داده و طراحی الگوریتم
- آموزش ساختمان دادهها با C و ++C (همراه با حل نمونه سوالات کنکور ارشد)
- مجموعه آموزشهای برنامه نویسی
- ساختمان داده (Data Structure) — راهنمای جامع و کاربردی
- آموزش ساختمان داده — مجموعه مقالات جامع وبلاگ فرادرس
^^
با سلام
خسته نباشید
میشه این سوال رو جواب بدین
الگوریتم مرتب سازی حبابی را به گونه ای اصلاح شود که به شانس بستگی داشته باشد
ممنون
شبه کد و توضیحات اشتباه هستند همونطور که توی کد های کپی شده از سایت های دیگه مشخصه لوپ داخلی می بایست تا arr.length – i – 1 باشه نه تا arr.length – 1
با سلام و احترام؛
صمیمانه از همراهی شما با مجله فرادرس و ارائه بازخورد سپاسگزاریم.
با توجه به اینکه اندیسدهی در کدهای داخل حلقه تودرتو متفاوت است، شرط حلقه داخلی هم در شبهکد مربوطه با نمونههای مشابه فرق دارد. مشکل خاصی در عملکرد این شبهکد مشاهده نمیشود. در صورت وجود مشکل در کدها و همچنین توضیحات، لطفاً مشکل را دقیقتر شرح بدهید تا امکان بررسی بیشتر وجود داشته باشد.
برای شما آرزوی سلامتی و موفقیت داریم.
سلام خسته نباشید
چیکار باید بکنیم که بجای اینکه چنتا عدد بدیم مرتب کنه اعداد نامحدود باشه؟
اصلا این حرکت منطقی نیست وقتی اعداد نا محدود باشه مرتب سازی تا بی نهایت ادامه پیدا میکنه و الگوریتمی که پایان نداشته باشه غلطه