تخفیف نوروزی پی استور

کد تخفیف: PR1404

شامل تمامی آثار
روز
ساعت
دقیقه
ثانیه

با خرید اشتراک ویژه ، با هزینه بسیار کمتر به فایل های پاورپوینت دسترسی داشته باشید!

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

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

فهرست مطالب

مقدمه

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

ویژگی‌های مرتب سازی حبابی ( روش تعویض استاندارد)

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

مثال قدم به قدم

آرایه با ۶ عنصر یعنی n=6 را در نظر بگیرید اکنون می‌خواهیم این آرایه به صورت صعودی یعنی از کوچک به بزرگ مرتب کنیم این آرایه با اندیس‌های ۰ تا ۵ (شماره های قرمز) و عناصر داخل (شماره های مشکی) آن طبق شکل زیر مشخص است.

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

برای مرتب سازی این آرایه ۵ مرحله نیاز داریم یعنی n-1 مرحله و در هر مرحله به ۵ مقایسه (n-1) بین اعضای آن نیاز خواهیم داشت. پس در کل به ۲۵ مقایسه نیاز داریم هر چند ممکن است در نصف راه هم به آرایه مرتب برسیم ولی تا پایان الگوریتم این مقایسه‌ها بایستی انجام پذیرد. ( البته در پیاده سازی تنها به ۱۵ مقایسه نیاز داریم ) با استفاده از شکل‌ها پیش می‌رویم. مرحله اول مرتب سازی حبابی برای مثال فوق به صورت زیر است.

مرتب سازی حبابی Bubble Sort

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

الگوریتم Bubble Sortمرحله چهارم مرتب سازی

مرتب سازی حبابی Bubble Sortمرحله ۵ مرتب سازی

الگوریتم Bubble Sort چیست؟

با مشاهده این مثال بخوبی متوجه شدید که در هر مرحله نیاز به ۵ مقایسه داریم. در مرحله پایانی هیچ تغییر یا جابجایی بر رو آرایه انجام نشد اگر فرض بر این باشد طول آرایه بیشتر از ۶ باشد و در مرحله مثلاً ۴ام آرایه مرتب باشد پس مراحل بعدی عملاً بیهوده خواهد بود یعنی الگوریتم مقایسه‌های بیهوده‌ای را تا آخر انجام می‌دهد برای اجتناب از این کار می‌توان در هر مرحله یک متغییری را تعریف کرد که اگر در مرحله ای هیچ جابجایی انجام نشود ( یعنی آرایه مرتب شده) پس Breack کن یعنی از مراحل بعدی صرف نظر کن. در راستای همین موضوع می‌توانید از فایل آماده موجود در لینک زیر بهره ببرید و ارائه‌ای جذاب داشته باشید.

پیچیدگی زمانی الگوریتم

الگوریتم مرتب سازی حبابی برای مجموعه داده‌های بزرگ مناسب نیست، زیرا پیچیدگی زمانی آن در حالت میانگین و بدترین حالت برابر با (Ο(n۲ است، که در آن n تعداد کل عناصر مجموعه داده محسوب می‌شود.

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

#include <stdio.h> 
  
void swap(int *xp, int *yp) 
{ 
    int temp = *xp; 
    *xp = *yp; 
    *yp = temp; 
} 
  
// A function to implement bubble sort 
void bubbleSort(int arr[], int n) 
{ 
   int i, j; 
   for (i = 0; i < n-1; i++)       
  
       // Last i elements are already in place    
       for (j = 0; j < n-i-1; j++)  
           if (arr[j] > arr[j+1]) 
              swap(&arr[j], &arr[j+1]); 
} 
  
/* Function to print an array */
void printArray(int arr[], int size) 
{ 
    int i; 
    for (i=0; i < size; i++) 
        printf("%d ", arr[i]); 
    printf("n"); 
} 
  
// Driver program to test above functions 
int main() 
{ 
    int arr[] = {64, 34, 25, 12, 22, 11, 90}; 
    int n = sizeof(arr)/sizeof(arr[0]); 
    bubbleSort(arr, n); 
    printf("Sorted array: \n"); 
    printArray(arr, n); 
    return 0; 
}

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

همانطور که قبلاً هم اشاره شد الگوریتم مرتب سازی حبابی معمولی دارای عیب است یعنی پس از مرتب سازی کامل در یکی  از مراحل الگوریتم مقایسه‌های بیهوده‌ای را تا آخر انجام می‌دهد برای اجتناب از این کار می‌توان در هر مرحله یک متغییری را تعریف کرد که اگر در مرحله‌ای هیچ جابجایی انجام نشود ( یعنی آرایه مرتب شده) پس Breack کن یعنی از مراحل بعدی صرف نظر کن. کد زیر الگوریتم مرتب سازی حبابی بهینه شده است که در آن مشکل مقایسه‌های بیهوده رفع شده است.
#include <stdio.h> 
  
void swap(int *xp, int *yp) 
{ 
    int temp = *xp; 
    *xp = *yp; 
    *yp = temp; 
} 
  
// An optimized version of Bubble Sort 
void bubbleSort(int arr[], int n) 
{ 
   int i, j; 
   bool swapped; 
   for (i = 0; i < n-1; i++) 
   { 
     swapped = false; 
     for (j = 0; j < n-i-1; j++) 
     { 
        if (arr[j] > arr[j+1]) 
        { 
           swap(&arr[j], &arr[j+1]); 
           swapped = true; 
        } 
     } 
  
     // IF no two elements were swapped by inner loop, then break 
     if (swapped == false) 
        break; 
   } 
} 
  
/* Function to print an array */
void printArray(int arr[], int size) 
{ 
    int i; 
    for (i=0; i < size; i++) 
        printf("%d ", arr[i]); 
    printf("n"); 
} 
  
// Driver program to test above functions 
int main() 
{ 
    int arr[] = {64, 34, 25, 12, 22, 11, 90}; 
    int n = sizeof(arr)/sizeof(arr[0]); 
    bubbleSort(arr, n); 
    printf("Sorted array: \n"); 
    printArray(arr, n); 
    return 0; 
}

با مشاهده این مثال بخوبی متوجه شدید که در هر مرحله نیاز به ۵ مقایسه داریم. در مرحله پایانی هیچ تغییر یا جابجایی بر رو آرایه انجام نشد اگر فرض بر این باشد طول آرایه بیشتر از ۶ باشد و در مرحله مثلاً ۴ ام آرایه مرتب باشد پس مراحل بعدی عملاً بیهوده خواهد بود یعنی الگوریتم مقایسه‌های بیهوده‌ای را تا آخر انجام می‌دهد برای اجتناب از این کار می‌توان در هر مرحله یک متغییری را تعریف کرد که اگر در مرحله‌ای هیچ جابجایی انجام نشود ( یعنی آرایه مرتب شده) پس Breack کن یعنی از مراحل بعدی صرف نظر کن.



در این آموزش الگوریتم مرتب سازی حبابی Bubble Sort بصورت کامل با یک مثال عملی توضیح داده شد این آموزش بصورت اختصاصی از سایت پی استور منتشر شده است.

یک پاسخ

  1. با سلام عرض ادب به استاد گرامی
    استاد از شما سوالی داشتم
    این سوال چطوری حل میشه؟
    پیچیدگی زمانی الگوریتم مرتب سازی حبابی را تحلیل کنید.(ابتدا کد الگوریتم را بنویسید سپس پیچیدگی آنرا تحلیل کنید)

دیدگاهتان را بنویسید

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