مرتب سازی حبابی سی شارپ
در این نوشته قصد بررسی الگوریتم مرتب سازی حبابی که در اکثر مباحث ساختمان داده بررسی میشود بپردازیم. در پایان آن را با زبان برنامه نویسی سی شارپ پیاده سازی میکنیم.
پیشنهاد نویسنده: الگوریتم مرتب سازی حبابی با PHP
مرتب سازی حبابی سی شارپ
الگوریتم مرتبسازی حبابی چیست؟
الگوریتم مرتبسازی، در دانش رایانه و ریاضی، الگوریتمی است که بعد از اجرای آن فهرستی از دادهها را به ترتیبی تعریف شده تبدیل میشود. پرکاربردترین ترتیبها، ترتیبهای عددی (نزولی، صعودی و…) هستند. مرتبسازی در بهینهسازی الگوریتمهایی که به فهرستهای مرتب شده نیاز دارند اهمیت بسیار زیادی دارد. از آغاز علم رایانه مسائل مرتب سازی در ساختمات داده بررسیهای فراوانی را متوجه خود ساختند. شاید به این علت که در عین ساده بودن این عملیات، حل آن به صورت کامل و عملی کمی پیچیده است. برای نمونه مرتبسازی حبابی در سال 1956 میلادی به وجود آمد. در آن زمان بسیاری این را یک مسئله را حل شده میپنداشتند.

مبحث مرتب سازی دادهها در کلاسهای معرفی علم رایانه بسیار پرکاربرد و پر بحث است. مبحثی که در آن وجود الگوریتمهای فراوان به آشنایی با ایدههای کلی و مراحل طراحی الگوریتمهای گوناگون کمک میکند. مرتبسازی حبابی که به زبان انگلیسی به Bubble sort معروف است یک الگوریتم مرتب سازی بسیار ساده است. در این الگوریتم دادهها در یک لیست پشت سرهم پیمایش میشوند. هر بار عناصر کنار هم را با هم مقایسه و اگر در جای نادرست (با توجه به شرط مرتب سازی) بودند به جای مناسب خود منتقل کند. در این الگوریتم این کار باید تا زمانی که هیچ انتقالی در لیست نیاز نشود رخ دهد، ادامه یابد و در آن زمان لیست مرتب شده است. در مرتب سازی حبابی هر عنصر با عنصر کناری خود مقایسه شده و در صورتی که از آن کوچکتر شود جای خود را به آن میدهد. این کار همچنان پیش میرود تا کوچکترین عنصر دادهای به پایین لیست برسد و دیگران نیز به ترتیب در جای خود قرار گیرند.
مرتب سازی حبابی با c#
کد این الگوریتم را در زیر مشاهده میکنید:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WpfApplication
{
public class Sort
{
/* public string showArr()
{
string result = "";
for (int i = 0; i <= 9; i++)
{
result += a[i] + " - ";
}
return result;
}
*/
public void hobab(ref int[] a)
{
for (int i = 0; i <= 9; i++)
{
for (int j = 0; j <= 8; j++)
{
if (a[j] > a[j + 1])
{
int x;
x = a[j + 1];
a[j + 1] = a[j];
a[j] = x;
}
}
}
}
}
}
برای یادگیری مفاهیم ساختمان داده کتاب ساختمان داده را دانلود کنید. اگر کد مناسبتری از این الگوریتم در دسترس دارید آنرا برای ما ارسال کنید.



















تفاوت پیادهسازی کلاسیک و Cocktail Shaker Sort چیه؟
تفاوت اصلی در این است که مرتبسازی حبابی کلاسیک فقط یک بار لیست را پیمایش میکند، در حالی که مرتبسازی کوکتل شیکر در هر پیمایش هم به سمت جلو و هم به سمت عقب حرکت میکند.
برای تبدیل این کد به یک متد Generic که بتونه روی هر نوع داده کار کنه، چه تغییراتی لازمه؟
برای تبدیل این کد به یک متد Generic، باید نوع آرایه را به `T[]` تغییر دهید و از مقایسهکنندهها (comparers) استفاده کنید.
Bubble Sort رو با LINQ یا IEnumerable میشه بازنویسی کنه؟
سلام، بله امکان بازنویسی Bubble Sort با LINQ یا IEnumerable وجود دارد، اما ممکن است پیچیدگی کد را افزایش دهد.
این الگوریتم برای لیستهای خیلی بزرگ مناسب نیست.
ممنون از نکته سنجی شما. بله، مرتبسازی حبابی برای لیستهای کوچک مناسبتر است و برای دادههای حجیم الگوریتمهای کارآمدتری وجود دارند.
چه زمانی بهتره از روش بهینهتر با flag استفاده کرد تا از تعداد مرتبسازیها کم بشه؟
استفاده از flag زمانی مفید است که لیست شما ممکن است از قبل مرتب شده باشد، در این صورت الگوریتم زودتر متوقف شده و از مقایسههای اضافی جلوگیری میکند.
افزودن یک پرچم برای تشخیص عدم جابهجایی در هر پاس چهقدر روی عملکرد اثر میگذارد؟
با سلام. استفاده از پرچم برای تشخیص عدم جابهجایی میتواند در برخی موارد، بهویژه برای آرایههای تقریباً مرتب شده، باعث بهبود عملکرد مرتبسازی حبابی شود و از تکرار غیرضروری جلوگیری کند.
در آرایههای با تعداد عناصر زیاد، تأثیر مصرف حافظه و زمان این روش چقدر میشود؟
با سلام، الگوریتم مرتبسازی حبابی برای آرایههای بزرگ از نظر زمان اجرا و مصرف حافظه چندان بهینه نیست و روشهای بهتری مانند مرتبسازی ادغامی یا سریعتر وجود دارند.
آیا میشه نسخه Generic از این تابع نوشت که با هر نوع قابل مقایسه کار کند؟
بله، آقای جابری، با استفاده از Generic ها در سی شارپ میتوان این تابع را به گونهای نوشت که با انواع دادههای قابل مقایسه کار کند. این کار انعطافپذیری کد را افزایش میدهد.
چطور میتوان این کد را برای مرتبسازی نزولی تغییر داد؟
سلام عزیز، برای مرتبسازی نزولی، کافی است علامت مقایسه در شرط `if (a[j] > a[j + 1])` را به `<` تغییر دهید. با این کار، اعداد بزرگتر به سمت چپ منتقل میشوند.
پیچیدگی زمانی در حالت بهترین، متوسط و بدترین حالت چطور مقایسه میشود؟
با سلام رویا جان، پیچیدگی زمانی مرتبسازی حبابی در حالتهای مختلف (بهترین، متوسط و بدترین) O(n^2) است، زیرا در تمام حالات نیاز به مقایسه و جابجایی عناصر وجود دارد.