مرتب سازی حبابی یا 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 ) هم استفاده کنید ولی با توجه به پیچیدگی این الگوریتم ، بهتر است از الگوریتمهای دیگر با پیچیدگی کمتر استفاده کنید !
امیدوارم که این آموزش نظر شما را جلب کرده باشد