مرتب سازی حبابی یا Bubble Sort یک الگوریتم ساده برای مرتب سازی است . این الگوریتم مرتب سازی بر اساس مقایسه دو المنت مجاور کار می‌کند و در صورتیکه دو المنت مجاور در آرایه بصورت مرتب قرار نگرفته باشند ، جای آن ها را عوض می‌کند. استفاده از این الگوریتم به علت پیچیدگی O(n2) ، برای آرایه های طولانی توصیه نمی‌شود.

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

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

همونطور که گفته شد ، پیچیدگی این الگوریتم O(n2) هست ! بنابراین مراحل زیر بعد از رسیدن به خانه‌ی آخر به تعداد خانه‌های آرایه تکرار خواهد شد. ( در اینجا ۵ بار ).

مرتب سازی حبابی با دو المنت اول شروع می‌شود و آن‌ها را از نظر اندازه چک می‌کند.

در اینجا ۳۳ از ۱۴ بزرگتر است پس در حال حاضر در جایگاه درستی قرار دارد. بعد از آن ، سراغ مقایسه‌ی ۳۳ و ۲۷ می‌رویم.

همانطور که مشخص است ، ۲۷ از ۳۳ کوچکتر است پس باید جایش با ۳۳ عوض شود.

آرایه‌ی جدید به این شکل خواهد بود:

باتوجه به آرایه‌ی جدید ، در مرحله‌ی بعدی به سراغ مقایسه‌ی ۳۳ و ۳۵ می‌رویم. و به این موضوع پی می‌بریم که در جای درست خود قرار دارند ( بصورت نزولی مرتب شده‌اند ) .

در مرحله‌ی بعدی به سراغ دو المنت بعدی آرایه می‌رویم ( ۳۵ و ۱۰ ).

همونطور که میدانیم ، ۱۰ از ۳۵ کوچکتر است ! پس جای این دو با یکدیگر عوض می‌شود.

بعد از اینکه به خانه‌ی آخر آرایه رسیدیم ، این عملیات یکبار دیگر تکرار خواهد شد ( در کل این مراحل به تعداد خانه‌های آرایه تکرار می‌شوند ). بعد از یک تکرار آرایه به این شکل درخواهد آمد :

در تکرار دوم می‌بینید که خانه‌های مجاور در آرایه به چه شکل با هم جابجا می‌شوند :

آرایه بعد از تکرار سوم :

و در نهایت بعد از تکرار چهارم ( در مجموع ۵ بار تکرار ) آرایه به مرتب سازی نیاز نخواهد داشت و تمامی المنت‌های آرایه بصورت نزولی مرتب شده اند :

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

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

ما یک لیست را به عنوان آرایه‌ای با n خانه به الگوریتم وارد می‌کنیم. با این تصور که در قبل تابعی را برای جابجایی دو المنت از آرایه تعریف کردیم به الگوریتم bubble sort نگاهی می‌اندازیم :

begin BubbleSort(list)

   for all elements of list
      if list[i] > list[i+1]
         swap(list[i], list[i+1])
      end if
   end for
   
   return list
   
end BubbleSort

کد مرتب سازی حبابی

کد مرتب سازی حبابی به زبان C ، کدی مانند کد زیر خواهد بود :

 
#include <stdio.h>
 
int main()
{
  int array[100], n, c, d, swap;
 
  printf("Enter number of elements\n");
  scanf("%d", &n);
 
  printf("Enter %d integers\n", n);
 
  for (c = 0; c < n; c++)
    scanf("%d", &array[c]);
 
  for (c = 0 ; c < ( n - 1 ); c++)
  {
    for (d = 0 ; d < n - c - 1; d++)
    {
      if (array[d] > array[d+1]) /* For decreasing order use < */
      {
        swap       = array[d];
        array[d]   = array[d+1];
        array[d+1] = swap;
      }
    }
  }
 
  printf("Sorted list in ascending order:\n");
 
  for ( c = 0 ; c < n ; c++ )
     printf("%d\n", array[c]);
 
  return 0;
}

و اگر بخواهیم در کد خود از تابع مرتب سازی حبابی استفاده کنیم ، می‌توانیم از کد زیر بهره ببریم :


#include <stdio.h> void bubble_sort(long [], long); int main() { long array[100], n, c, d, swap; printf("Enter number of elements\n"); scanf("%ld", &n); printf("Enter %ld integers\n", n); for (c = 0; c < n; c++) scanf("%ld", &array[c]); bubble_sort(array, n); printf("Sorted list in ascending order:\n"); for ( c = 0 ; c < n ; c++ ) printf("%ld\n", array[c]); return 0; } void bubble_sort(long list[], long n) { long c, d, t; for (c = 0 ; c < ( n - 1 ); c++) { for (d = 0 ; d < n - c - 1; d++) { if (list[d] > list[d+1]) { /* Swapping */ t = list[d]; list[d] = list[d+1]; list[d+1] = t; } } } }

حرف پایانی

شما می‌توانید از این الگوریتم برای مرتب سازی رشته‌ها ( string ) هم استفاده کنید ولی با توجه به پیچیدگی این الگوریتم ، بهتر است از الگوریتم‌های دیگر با پیچیدگی کمتر استفاده کنید !

امیدوارم که این آموزش نظر شما را جلب کرده باشد چشمک