الگوریتم مرتب سازی تعویضی چیست؟ — کاربردها و مراحل پیاده سازی

الگوریتم مرتب سازی تعویضی چیست؟ و چه مزایا و معایب دارد.

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

الگوریتم مرتب سازی تعویضی چیست؟

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

مرتب سازی تعویضی

مراحل پیاده سازی الگوریتم مرتب سازی تعویضی

این الگوریتم، عناصر مجاور آرایه را با هم مقایسه کرده و اگر در ترتیب نامناسبی قرار داشته باشند، جای آنها را عوض می‌کند. این فرایند را به صورت مکرر تکرار می‌کند تا آرایه مرتب شود.

مثال: 

  arr[] = {5, 1, 4, 2, 8}

مراحل:

مرحله ۱: پیمایش اول

مقایسه ۵ و ۱: 5 > 1 ، پس تعویض می‌کنیم. آرایه می‌شود:

{۱, ۵, ۴, ۲, ۸}

مقایسه ۵ و ۴: 5 > 4 ، پس تعویض می‌کنیم. آرایه می‌شود:

{۱, ۴, ۵, ۲, ۸}

مقایسه ۵ و ۲: 5 > 2 ، پس تعویض می‌کنیم. آرایه می‌شود:

{۱, ۴, ۲, ۵, ۸}

مقایسه ۵ و ۸: 5 < 8 ، تعویضی انجام نمی‌شود. آرایه می‌ماند:

{۱, ۴, ۲, ۵, ۸}

مرحله ۲: پیمایش دوم

مقایسه ۱ و ۴: 1 < 4 ، تعویضی انجام نمی‌شود. آرایه می‌ماند:

{۱, ۴, ۲, ۵, ۸}

مقایسه ۴ و ۲: 4 > 2 ، پس تعویض می‌کنیم. آرایه می‌شود:

{۱, ۲, ۴, ۵, ۸}

مقایسه ۴ و ۵: 4 < 5 ، تعویضی انجام نمی‌شود. آرایه می‌ماند:

{۱, ۲, ۴, ۵, ۸}

مقایسه ۵ و ۸: 5 < 8 ، تعویضی انجام نمی‌شود. آرایه می‌ماند:

{۱, ۲, ۴, ۵, ۸}

مرحله ۳: پیمایش سوم

مقایسه ۱ و ۲: 1 < 2 ، تعویضی انجام نمی‌شود. آرایه می‌ماند:

{۱, ۲, ۴, ۵, ۸}

مقایسه ۲ و ۴: 2 < 4 ، تعویضی انجام نمی‌شود. آرایه می‌ماند:

{۱, ۲, ۴, ۵, ۸}

مقایسه ۴ و ۵: 4 < 5 ، تعویضی انجام نمی‌شود. آرایه می‌ماند:

{۱, ۲, ۴, ۵, ۸}

در این مرحله آرایه بصورت (۸,۵,۴,۲,۱) مرتب شده است.

مزایا و معایب الگوریتم مرتب سازی تعویضی

در زیر به بررسی مزایا و معایب الگوریتم مرتب سازی تعویضی می‌پردازیم:

مزایا:

  • سادگی پیاده‌سازی: الگوریتم تعویضی بسیار ساده و قابل فهم است و پیاده‌سازی آن آسان است. این امر برای آموزش مفاهیم اولیه مرتب سازی بسیار مفید است.
  • پایداری: مرتب سازی تعویضی پایدار است. این بدان معناست که ترتیب نسبی عناصر با مقدار برابر در آرایه خروجی، همان ترتیب آنها در آرایه ورودی است.
  • مناسب برای آرایه‌های کوچک و تقریباً مرتب: اگر آرایه ورودی کوچک باشد یا عناصر آن تقریباً مرتب باشند، الگوریتم تعویضی می‌تواند عملکرد قابل قبولی داشته باشد. در این موارد، سربار الگوریتم‌های پیشرفته‌تر توجیه‌پذیر نیست.

معایب:

  • کارایی پایین: پیچیدگی زمانی الگوریتم تعویضی در حالت بدترین و متوسط O(n²) است. این بدان معناست که زمان اجرای الگوریتم با افزایش تعداد عناصر به صورت مجذوری افزایش می‌یابد. بنابراین، برای آرایه‌های بزرگ، این الگوریتم بسیار کند است.
  • تعداد زیاد مقایسه: الگوریتم تعویضی تعداد زیادی مقایسه بین عناصر انجام می‌دهد، حتی اگر آرایه تقریباً مرتب باشد.
  • مناسب برای آرایه‌های بزرگ نیست: به دلیل پیچیدگی زمانی O(n²)، برای آرایه‌های بزرگ، الگوریتم تعویضی بسیار ناکارآمد است. الگوریتم‌های کارآمدتری مانند مرتب سازی ادغامی (Merge Sort) یا مرتب سازی سریع (Quick Sort) با پیچیدگی زمانی O(n log n) وجود دارند که برای آرایه‌های بزرگ بسیار مناسب‌تر هستند.

کاربردهای الگوریتم مرتب سازی تعویضی

الگوریتم‌های مرتب سازی تعویضی مانند Bubble Sort و Selection Sort با وجود سادگی، در عمل برای داده‌های بزرگ کارایی مناسبی ندارند. اما در برخی شرایط خاص، استفاده از این الگوریتم‌ها منطقی و مؤثر است. در ادامه به مهم‌ترین کاربردهای آن‌ها اشاره می‌شود:

۱. آموزش مفاهیم پایه الگوریتم و برنامه‌نویسی

  • سادگی مفهومی و پیاده‌سازی این الگوریتم‌ها باعث شده‌اند که در دوره‌های مقدماتی آموزش برنامه‌نویسی، به عنوان اولین الگوریتم‌های مرتب سازی آموزش داده شوند.
  • به دلیل ماهیت مرحله‌به‌مرحله و قابل مشاهده بودن عملکرد، در تصویری‌سازی الگوریتم‌ها نیز بسیار کاربرد دارند.

۲. استفاده در سیستم‌های کوچک با نیازهای ساده

  • در سیستم‌های تعبیه‌شده (Embedded Systems) با منابع محدود که داده‌های ورودی کوچک هستند (مثلاً کمتر از ۱۰ یا ۲۰ عنصر)، استفاده از الگوریتم‌هایی مانند Selection Sort منطقی است.
  • گاهی در میکروکنترلرها یا سیستم‌های ساده، سادگی کد مهم‌تر از کارایی است.

۳. کاربرد در داده‌های تقریباً مرتب

  • نسخه بهینه‌شده‌ی Bubble Sort می‌تواند عملکرد خوبی در مرتب سازی داده‌هایی که تقریباً مرتب هستند، داشته باشد (زمان اجرا نزدیک به O(n)).
  • در این موارد، الگوریتم ممکن است در همان چند دور ابتدایی متوقف شود، چون متوجه می‌شود لیست مرتب است.

۴. موقعیت‌های تست و بررسی عملکرد الگوریتم‌ها

  • الگوریتم‌های تعویضی به عنوان معیار پایه (Baseline) در تست و ارزیابی سایر الگوریتم‌های مرتب سازی پیچیده‌تر مورد استفاده قرار می‌گیرند.

۵. پروژه‌ها و تمرین‌های دانشگاهی

  • به دلیل سادگی، این الگوریتم‌ها انتخاب مناسبی برای تمرین طراحی و تحلیل الگوریتم‌ها در دروس دانشگاهی هستند.
  • در تمرین‌های مقایسه‌ای، برای بررسی تفاوت کارایی بین الگوریتم‌های O(n²) و الگوریتم‌های بهینه‌تر مانند Merge Sort و Quick Sort به‌کار می‌روند.

مقایسه الگوریتم مرتب سازی تعویضی با ادغامی

در این قسمت از مقاله به مقایسه الگوریتم مرتب سازی تعویضی با الگوریتم ادغامی می‌پردازیم:

ویژگی  مرتب سازی تعویضی مرتب سازی ادغامی
پیچیدگی زمانی ( بدترین حالت) (۲^n)O ( n log n )O
پیچیدگی زمانی ( بهترین حالت) (n)O O( n log n )
روش اجرا مقایسه و تعویض عناصر مجاور تقسیم بازگشتی و ادغام مرتب شده
کارایی روی داده های بزرگ ضعیف بسیار خوب
مناسب برای سیستم های با حافظه محدود؟ بله خیر (نیاز به حافظه اضافی دارد)

پیاده سازی الگوریتم مرتب سازی تعویضی

در ادامه پیاده سازی الگوریتم با زبان‌های برنامه نویسی مختلف آورده شده است.

پیاده سازی الگوریتم مرتب سازی تعویضی با زبان برنامه نویسی ++C

// C++ code for the above approach
#include <bits/stdc++.h>
using namespace std;

// Function for Exchange sort
// in Descending order
void exchangeSort(int num[], int size)
{
    int i, j, temp;
    for (i = 0; i < size - 1; i++) {
        for (j = i + 1; j < size; j++) {

            // Sorting into descending
            // order when previous element
            // is smaller than next element
            if (num[i] < num[j]) {

                // Swapping
                temp = num[i];
                num[i] = num[j];
                num[j] = temp;
            }
        }
    }
}

// Driver code
int main()
{
    int arr[5] = { 5, 1, 4, 2, 8 };

    // Function call
    exchangeSort(arr, 5);

    for (int i = 0; i < 5; i++) {
        cout << arr[i] << " ";
    }
    return 0;
}

پیاده سازی الگوریتم مرتب سازی تعویضی با زبان برنامه نویسی جاوا

import java.util.Arrays;

public class ExchangeSort {
    
    // Function for Exchange sort in Descending order
    static void exchangeSort(int[] num) {
        int size = num.length;
        int temp;

        for (int i = 0; i < size - 1; i++) {
            for (int j = i + 1; j < size; j++) {

                // Sorting into descending order when previous element
                // is smaller than the next element
                if (num[i] < num[j]) {

                    // Swapping
                    temp = num[i];
                    num[i] = num[j];
                    num[j] = temp;
                }
            }
        }
    }

    // Driver code
    public static void main(String[] args) {
        int[] arr = { 5, 1, 4, 2, 8 };

        // Function call
        exchangeSort(arr);

        // Printing the sorted array
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

پیاده سازی الگوریتم مرتب سازی تعویضی با زبان برنامه نویسی پایتون

# Python code for the above approach

# Function for Exchange sort
# in Descending order
def exchange_sort(arr):
    size = len(arr)
    for i in range(size - 1):
        for j in range(i + 1, size):

            # Sorting into descending
            # order when previous element
            # is smaller than next element
            if arr[i] < arr[j]:

                # Swapping
                arr[i], arr[j] = arr[j], arr[i]

# Driver code
if __name__ == "__main__":
    arr = [5, 1, 4, 2, 8]

    # Function call
    exchange_sort(arr)

    for num in arr:
        print(num, end=" ")

پیاده سازی الگوریتم مرتب سازی تعویضی با زبان برنامه نویسی #C

using System;

class Program {
    // Function for Exchange sort
    // in Descending order
    static void ExchangeSort(int[] num, int size)
    {
        int i, j, temp;
        for (i = 0; i < size - 1; i++) {
            for (j = i + 1; j < size; j++) {
                // Sorting into descending
                // order when previous element
                // is smaller than next element
                if (num[i] < num[j]) {
                    // Swapping
                    temp = num[i];
                    num[i] = num[j];
                    num[j] = temp;
                }
            }
        }
    }

    // Driver code
    static void Main()
    {
        int[] arr = { 5, 1, 4, 2, 8 };

        // Function call
        ExchangeSort(arr, 5);

        // Printing the sorted array
        for (int i = 0; i < 5; i++) {
            Console.Write(arr[i] + " ");
        }
    }
}

پیاده سازی الگوریتم مرتب سازی تعویضی با زبان برنامه نویسی جاوا

// Function for Exchange sort in Ascending order
function exchangeSort(arr) {
    const size = arr.length;

    for (let i = 0; i < size - 1; i++) {
        // Outer Loop
        for (let j = i + 1; j < size; j++) {
            // Inner Loop
            // Sorting into ascending order if
            // the previous element is bigger than the next
            // element; we swap to make it in ascending order
            if (arr[i] > arr[j]) {
                // Swapping
                const temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
}

// Driver code
const arr = [5, 1, 4, 2, 8];

// Function call
exchangeSort(arr);

// Output the sorted array
console.log(arr.join(' '));

خروجی تمام کد های بالا بصورت زیر است:

۸ ۵ ۴ ۲ ۱

سخن آخر

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


سوالات متداول


آیا الگوریتم‌های تعویضی برای داده‌های تکراری مناسب هستند؟

بله، به خصوص اگر الگوریتم پایدار باشد (مانند Bubble Sort)، می‌تواند ترتیب عناصر با مقدار برابر را حفظ کند.

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

برای لیست‌های خیلی کوچک یا زمانی که داده‌ها تقریباً مرتب هستند.

آیا می‌توان الگوریتم‌های تعویضی را برای مرتب‌سازی نزولی هم استفاده کرد؟

بله. فقط کافی است شرط مقایسه را تغییر دهید (مثلاً اگر a < b بود تعویض شود، نه برعکس).

آیا الگوریتم‌های تعویضی پایدار هستند؟

بعضی هستند و بعضی نه. مثلاً Bubble Sort پایدار است، ولی Selection Sort ناپایدار است.

معروف‌ترین الگوریتم‌های مرتب‌سازی تعویضی کدام‌اند؟

مهم‌ترین آن‌ها عبارتند از: Bubble Sort (مرتب‌سازی حبابی) Selection Sort (مرتب‌سازی انتخابی) Cocktail Sort Gnome Sort

میزان رضایتمندی
لطفاً میزان رضایت خودتان را از این مطلب با دادن امتیاز اعلام کنید.
[ امتیاز میانگین 0 از 0 نفر ]
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع و مراجع:
geeksforgeeks codingunit مجله پی‌استور

دیدگاه‌ خود را بنویسید

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

پیمایش به بالا