توضیح الگوریتم مرتب سازی تعویضی و پیاده سازی آن در زبان های مختلف
![توضیح الگوریتم مرتب سازی تعویضی و پیاده سازی آن در زبان های مختلف](https://blog.faradars.org/wp-content/webp-express/webp-images/doc-root/wp-content/uploads/2024/07/In-a-bustling-cafe-in-Rome-Italy-a-programmer-is-coding-1.jpg.webp)
فرایند کار الگوریتم مرتب سازی تعویضی به این صورت است که هر عنصر در آرایههای برنامه نویسی را با عنصر دیگری مقایسه میکند. در حین مقایسه، عناصری را که در جایگاه مناسب خود قرار نگرفتهاند، با یکدیگر جابهجا یا تعویض میکند. دقیقا مانند رفتاری که الگوریتم مرتب سازی حبابی انجام میدهد. تنها تفاوت اصلی این الگوریتمها روش آنها برای مقایسه عنصرها است. «الگوریتم مرتب سازی تعویضی» (Exchange Sort Algorithm) به میزان زیادی به الگوریتم مرتبسازی حبابی شباهت دارد. در واقع بعضی از افراد، به مرتبسازی تعویضی به عنوان نوع دیگری از «مرتبسازی حبابی» (Bubble Sort) رجوع میکنند. حتی گاهی وقتی که کدهای مربوط به الگوریتم مرتب سازی تعویضی را میبینند، به جای استفاده از نام اصلی آن که مرتبسازی تعویضی است، آن را به نام الگوریتم مرتبسازی حبابی صدا میزنند.
در این مطلب از مجله فرادرس با الگوریتم مرتب سازی تعویضی آشنا میشویم. با کمک مثالهای سادهای سعی میکنیم که به بهترین شکل ممکن، این الگوریتم و روش کار آن را درک کنیم. سپس شبه کد مرتبط با آن را میبینیم. در بخش بعدی به پیادهسازی کدهای الگوریتم از روی آن شبه کد پرداختهایم. در واقع، کدهای مرتبسازی تعویضی را با کمک ۵ زبان برنامه نویسی مختلف کدنویسی کردیم. در نهایت هم پیچیدگیها، کاربردها و امتیازهای استفاده از این الگوریتم را بررسی میکنیم.
الگوریتم مرتب سازی تعویضی چیست؟
الگوریتم مرتب سازی تعویضی بسیار شبیه به الگوریتم مرتبسازی حبابی عمل میکند. در این الگوریتم هم اولین عنصر را با تمام عناصر موجود در آرایه مقایسه و در صورت نیاز، عناصر را با یکدیگر جابهجا میکنیم. در بعضی از موقعیتها مرتبسازی تعویضی، به میزان کمی بهتر از همتای خود، یعنی الگوریتم مرتبسازی حبابی، عمل میکند. مرتبسازی حبابی برای تایید تکمیل شدن عمل مرتبسازی نیاز به گردش نهایی بر روی آرایه دارد. تکنیک مرتبسازی تعویضی این گردش نهایی را انجام نمیدهد. بنابراین، مرتبسازی حبابی کمی کارآیی پایینتری نسبت به الگوریتم مرتب سازی تعویضی دارد.
مرتبسازی تعویضی برای مرتبسازی آرایه به هر دو صورت نزولی و صعودی کار میکند. برای عملکرد نزولی آن فقط کافی است که شرط مقایسه درون حلقه درونی را برعکس کنیم.
تسلط به روش های طراحی الگوریتم با فرادرس
الگوریتم مرتبسازی تعویضی یکی از تکنیکهای مرتب سازی است. خود الگوریتمهای مرتبسازی بخش کوچکی از دنیای الگوریتمها را تشکیل میدهند. به عنوان برنامهنویس یا مهندس کامیپوتر خیلی خوب است که با الگوریتمها و روش طراحی آنها نیز آشنا باشیم.
طراحی الگوریتم یکی از مباحث بسیار پایه در علوم کامپیوتر است. البته این شاخه از دانش، کاربردهای بسیار گستردهتری به غیر از علوم کامپیوتری هم دارد. اما فرادرس با تاکید بر بخش کامپیوتری این شاخه از دانش، به تولید فیلمهای آموزشی مناسب کار توسعهدهندگان نرمافزار و سایر مهندسین کامپیوتر پرداخته است. از آنجا که طراحی الگوریتم در علوم کامپیوتر رابطه نزدیک و تنگاتنگی با برنامهنویسی و ساختمان داده دارد، در وبسایت آموزشی فرادرس با نگرش برنامهنویسی به تهیه فیلمهای آموزش طراحی انواع الگوریتمها و ساختمان داده پرداخته شده است.
در قسمت پایین چند فیلم آموزشی در ارتباط با طراحی الگوریتم و ساختمان داده را نام بردهایم. تسلط به این مبحث یکی از تخصصهای حرفهای برنامه نویسها و مهندسین نرمافزار است. در صورت نیاز با کلیک بر روی تصویر بالا میتوانید وارد صفحه اصلی این مجموعه آموزش شده و از فیلمهای آموزشی بیشتری استفاده کنید.
- فیلم آموزش طراحی الگوریتم به صورت جامع و با مفاهیم کلیدی در فراردس
- فیلم آموزش طراحی الگوریتم همراه با مرور و تست کنکور ارشد در فراردس
- فیلم آموزش طراحی الگوریتم در کنار حل مثال های عملی در فراردس
- فیلم آموزش حل سوالات آزمون های استخدامی طراحی الگوریتم در فراردس
مثالی برای درک روش کار الگوریتم
قبل از بررسی مثال مربوط به این بخش، باید بدانیم که برای درک روش طراحی، نوشتن و کار با الگوریتمها همیشه بهترین شیوه، پیادهسازی مثالهای عملی و کلنجار رفتن با مسائل مختلف برای حل آنها است. اما این کار هم نیازمند داشتن استاد یا راهنمایی است که قبل از شروع، برنامهنویس را با تکنیکهای لازم و به اصطلاح، فوت و فن کار آشنا کند. یکی از بهترین پیشنهادات برای استفاده از تجربه اساتید برتر تماشای فیلمهای آموزشی است که آنها تولید کردهاند. به همین منظور فیلم آموزشی به نام آموزش طراحی الگوریتم همراه با حل مثال های عملی در فرادرس تولید شده که کیفیت علمی بسیار مناسبی هم دارد. برای کمک به شما در ادامه، لینک این آموزش را قرار دادهایم.
در مثالی که برای کمک به درک روش کار الگوریتم مرتبسازی تعویضی آماده کردهایم، از آرایه فرضی به شکل arr[] = {5, 1, 4, 2, 8} استفاده میکنیم. خروجی آرایه باید به صورت {1, 2, 4, 5, 8} شود. به صورت خلاصه میتوان مراحل کار را در سه قدم توضیح داد.
- مرحله اول: مرتبسازی تعویضی از اولین عنصر شروع میکند. برای پیدا کردن عنصر بزرگتر، عنصر مورد نظر را به ترتیب با سایر عناصر مقایسه میکند.
( 5 1 4 2 8 ) –> ( 1 5 4 2 8 )
در بالا میبینیم که الگوریتم دو عنصر اول را مقایسه کرده و از آنجا که عدد ۵ بزرگتر از عدد ۱ است، جای آن دو عدد را با هم تعویض میکند. سپس با توجه به اینکه هیچ کدام از عناصر از عدد ۱ کوچکتر نیستند، بعد از اولین پیمایش آرایه به شکل زیر در میآید.
(1 5 4 2 8)
- مرحله دوم: در این مرحله، الگوریتم، عنصر موجود در دومین جایگاه را انتخاب کرده و شروع به مقایسه با عناصر موجود در جایگاههای بعدی میکند.
(1 5 4 2 8 ) –> ( 1 4 5 2 8 )
همینطور که مشاهده میکنیم، از آنجا که عدد ۴ از عدد ۵ کوچکتر است، جای این دو عنصر نیز در آرایه با هم تعویض میشود. مقایسه همینطور ادامه پیدا میکند تا به عدد ۲ برسیم.
( 1 4 5 2 8 ) –> ( 1 2 5 4 8 )
از آنجا که عدد ۲ هم از عدد ۴ کوچکتر است، باز هم باید جای عنصر دوم با عنصر مقایسه شده با آن تعویض شود. اما - همینطور که در پایین مشاهده میشود - در ادامه روند هیچ عنصر دیگری کوچکتر از ۲ نیست و آرایه به همان شکل باقی میماند.
( 1 2 5 4 8 )
- مرحله سوم: الان مقدار موجود در جایگاه سوم آرایه را به ترتیب با مابقی عناصر آرایه مقایسه میکنیم.
(1 2 5 4 8 ) -> (1 2 4 5 8 )
در اولین مقایسه مشخص است که عدد ۵ بزرگتر از عدد ۴ است. پس جای این دو عنصر آرایه با یکدیگر تعویض شده است. بعد از تکمیل پیمایش متوجه میشویم که آرایه به صورت مرتب شده درآمده است.
بعد از تکمیل پیمایشها باید از حلقه مربوط به این کار خارج شویم. سپس میتوانیم آرایه مرتب شده را به جهت استفاده سایر بخشهای سیستم یا نمایش به کاربر به خارج برگردانیم.
شبه کد مرتب سازی تعویضی
برای اینکه هر الگوریتمی را به کدهای زبان برنامه نویسی تبدیل کنیم، همیشه بهتر است که اولین کار، نوشتن شبه کد آن الگوریتم باشد. در کادر زیر شبه کد مربوط به الگوریتم مرتبسازی تعویضی را به صورت صعودی تعریف کردهایم.
procedure ExchangeSort(num: list of sortable items) n = length(A) // outer loop for i = 1 to n – 2 do // inner loop for j = i + 1 to n-1 do if num[i] > num[j] do swap(num[i], num[j]) end if end for end for end procedure
تمام مراحل مربوط به شبه کد الگوریتم مرتبسازی تعویضی به صورت صعودی را در فهرست زیر توضیح دادهایم.
- در ابتدای کار بر روی آرایه مورد نظر از خانه arr[1] تا به خانه n – 2 پیمایش میکنیم. این پیمایش در حلقه خارجی انجام میشود. با کمک پیمایش مورد نظر، هر عنصر را به صورت مجزا با تمام عناصر آرایه به جز خودش مقایسه میکنیم. در حلقه درونی همین مقایسه را به صورت منظمی در میآوریم. یعنی عنصر مورد نظر را فقط با عناصر بعد از خودش مقایسه میکنیم.
- حلقه درونی از ایندکس i + 1st شروع به مقایسه میکند. در این فرمول i برابر با ایندکس حلقه خارجی است.
- سپس عنصر i را با عنصر j مقایسه میکنیم. هر کدام از اینها که بزرگتر باشد باید در خانه عنصر i قرار بگیرد. یعنی در صورت نیاز مقادیر این دو عنصر از آرایه را با یکدیگر جابهجا میکنیم.
- برای اینکه نظم چیدمان را به صورت نزولی تغییر دهیم، فقط کافی است شرط را برعکس کنیم. یعنی عمل تعویض مقادیر عناصر به شرطی اتفاق بیافتد که عنصر j از عنصر i بزرگتر باشد.
![دو مانیتور در کنار یکدیگر به صورت روشن قرار گرفته و نمودار و دادههای مربوط به تحلیل اطلاعات را نشان میدهند. - الگوریتم مرتب سازی تعویضی](https://blog.faradars.org/wp-content/uploads/2024/07/A-modern-workspace-features-a-computer-showing-lines-of-code.jpg)
- اگر در این مقایسهها به موردی برخورد نکردیم که شرط if num[i] > num[j] برقرار باشد یعنی عناصر در شکل مرتب شده خودشان قرار دارند. بنابراین نیازی به تعویض مکان قرارگیری عنصرهای خاصی وجود ندارد.
- در نهایت فرایند چرخش هر دو حلقه درونی و بیرونی به پایان میرسد. از آنجا که ایندکس فعلی حلقه درونی برابر با i+1 است، نیاز نداریم که آخرین عنصر را به حلقه خارجی وارد کنیم. در نتیجه، وقتی که ایندکس حلقه خارجی برابر با n-2 شود، به دلیل ایندکس حلقه داخلی که برابر با i+1 است، آخرین عنصر به صورت خودکار مرتب شده خواهد بود. این سناریو رو میتوان به عنوان حالت خاص برای این الگوریتم در نظر گرفت.
پیاده سازی کدهای الگوریتم مرتب سازی تعویضی
در این قسمت از مطلب، الگوریتم مرتب سازی تعویضی را از روی شبه کد تعریف شده در بخش قبل با پنج زبان برنامهنویسی مختلف پیادهسازی کردهایم. داده ورودی به همه کدهای زیر برابر با arr[] = {5, 1, 4, 2, 8} است.
زبان برنامه نویسی ++C
زبان برنامهنویسی ++C، یکی از زبانهای خانواده C و زبانی قدیمی است، اما هنوز هم به عنوان یکی از محبوبترین گزینههای برنامهنویسی مخصوصا در بعضی از پروژههای بزرگ مربوط به مرورگرها یا بازی و غیره استفاده میشود. برای پیادهسازی الگوریتم مرتبسازی تعویضی در زبان ++C باید با حلقهها و قواعد شرطی این زبان آشنا باشید. به همین منظور پیشنهاد میکنیم که در صورت نیاز، مطالب بسیار مفید و کامل حلقه for در زبان برنامه نویسی ++C و گزاره های شرطی ساده و تودرتو در ++C به زبان ساده را از مجله فرادرس مطالعه کنید.
در کادر زیر کدهای مربوط به پیادهسازی الگوریتم مرتبسازی تعویضی را با زبان برنامه نویسی ++C نوشتهایم.
1#include <bits/stdc++.h>
2using namespace std;
3
4// Function for Exchange sort in Ascending order
5void exchangeSort(int num[], int size)
6{
7
8 int i, j, temp;
9 for (i = 0; i < size - 1; i++) {
10 // Outer Loop
11 for (j = i + 1; j < size; j++) {
12 // Inner Loop
13 // Sorting into ascending order if
14 // previous element bigger than next
15 // element we swap to make it in ascending order
16 if (num[i] > num[j]) {
17
18 // Swapping
19 temp = num[i];
20 num[i] = num[j];
21 num[j] = temp;
22 }
23 }
24 }
25}
26
27// Driver code
28int main()
29{
30
31 int arr[5] = { 5, 1, 4, 2, 8 };
32
33 // Function call
34 exchangeSort(arr, 5);
35 for (int i = 0; i < 5; i++) {
36 cout << arr[i] << " ";
37 }
38 return 0;
39}
زبان برنامه نویسی جاوا
در کادر زیر کدهای مربوط به پیادهسازی الگوریتم مرتبسازی تعویضی را با زبان برنامه نویسی جاوا نوشتهایم.
1import java.io.*;
2import java.util.*;
3
4class GFG {
5
6// Function for Exchange sort in Ascending order
7static void exchangeSort(int[] num, int size)
8{
9 int i, j, temp;
10 for (i = 0; i < size - 1; i++)
11 {
12
13 // Outer Loop
14 for (j = i + 1; j < size; j++)
15 {
16
17 // Inner Loop
18 // Sorting into ascending order if previous
19 // element bigger than next element we swap
20 // to make it in ascending order
21 if (num[i] > num[j])
22 {
23
24 // Swapping
25 temp = num[i];
26 num[i] = num[j];
27 num[j] = temp;
28 }
29 }
30 }
31}
32
33public static void main(String[] args)
34{
35 int[] arr = { 5, 1, 4, 2, 8 };
36
37 // Function call
38 exchangeSort(arr, 5);
39 for (int i : arr) {
40 System.out.print(i + " ");
41 }
42}
43}
زبان برنامه نویسی پایتون
در کادر زیر کدهای مربوط به پیادهسازی الگوریتم مرتبسازی تعویضی را با زبان برنامه نویسی پایتون نوشتهایم.
1def exchange_sort(num):
2 size = len(num)
3 for i in range(size - 1):
4 # Outer Loop
5 for j in range(i + 1, size):
6 # Inner Loop
7 # Sorting into ascending order if
8 # previous element bigger than next
9 # element we swap to make it in ascending order
10 if num[i] > num[j]:
11 # Swapping
12 num[i], num[j] = num[j], num[i]
13
14# Driver code
15if __name__ == "__main__":
16 arr = [5, 1, 4, 2, 8]
17
18 # Function call
19 exchange_sort(arr)
20 for i in range(len(arr)):
21 print(arr[i], end=" ")
زبان برنامه نویسی #C
در کادر زیر کدهای مربوط به پیادهسازی الگوریتم مرتبسازی تعویضی را با زبان برنامه نویسی #C نوشتهایم.
1using System;
2
3public class GFG {
4
5 // Function for Exchange sort in Ascending order
6 static void exchangeSort(int[] num, int size)
7 {
8 int i, j, temp;
9 for (i = 0; i < size - 1; i++) {
10
11 // Outer Loop
12 for (j = i + 1; j < size; j++) {
13
14 // Inner Loop
15 // Sorting into ascending order if previous
16 // element bigger than next element we swap
17 // to make it in ascending order
18 if (num[i] > num[j]) {
19
20 // Swapping
21 temp = num[i];
22 num[i] = num[j];
23 num[j] = temp;
24 }
25 }
26 }
27 }
28
29 static public void Main()
30 {
31
32 // Code
33 int[] arr = { 5, 1, 4, 2, 8 };
34
35 // Function call
36 exchangeSort(arr, 5);
37 foreach(int i in arr) { Console.Write(i + " "); }
38 }
39}
زبان برنامه نویسی جاوا اسکریپت
در کادر زیر کدهای مربوط به پیادهسازی الگوریتم مرتبسازی تعویضی را با زبان برنامه نویسی جاوا اسکریپت نوشتهایم.
1function exchangeSort(arr) {
2 const size = arr.length;
3
4 for (let i = 0; i < size - 1; i++) {
5 // Outer Loop
6 for (let j = i + 1; j < size; j++) {
7 // Inner Loop
8 // Sorting into ascending order if
9 // the previous element is bigger than the next
10 // element; we swap to make it in ascending order
11 if (arr[i] > arr[j]) {
12 // Swapping
13 const temp = arr[i];
14 arr[i] = arr[j];
15 arr[j] = temp;
16 }
17 }
18 }
19}
20
21// Driver code
22const arr = [5, 1, 4, 2, 8];
23
24// Function call
25exchangeSort(arr);
26
27// Output the sorted array
28console.log(arr.join(' '));
خروجی مربوط به همه کدهای بالا به صورت زیر به کاربر نمایش داده میشود.
1 2 4 5 8
پیچیدگی زمانی و فضایی مرتب سازی تعویضی
الگوریتم مرتب سازی تعویضی هر عنصر در لیست را به صورت دوبهدو با بقیه عنصرها مقایسه میکند. اگر جفت عنصرهای مقایسه شده، خارج از ترتیب باشند، آنها را جابهجا میکند. بنابراین، در همه حالتهای این الگوریتم یعنی، بهترین، بدترین و حالت میانگین آرایه ورودی، «پیچیدگی زمانی» (Time Complexity) برابر بااست. در این فرمول N تعداد اعضای آرایه ورودی را نشان میدهد. از آنجا که هر عنصر با همه عناصر دیگر مقایسه میشود. در نتیجه به تعدادعمل مقایسه انجام خواهد شد.
پیچیدگی فضایی مرتبسازی تعویضی هم برابر بااست.
فیلم های آموزش الگوریتم ها و ساختمان داده فرادرس
توانایی طراحی و نوشتن الگوریتم در کنار داشتن علم مربوط به ساختمان داده میتواند باعث خلق برنامههای با عملکرد بسیار خوب و مصرف منابع بهینه شود. این دو رشته به ظاهر جدا از هم برای گذاشتن بیشترین تاثیر خود در برنامهها نیاز جدی به یکدیگر دارند.
فرادرس به عنوان تولید کننده محتوی آموزشی، همیشه تلاش کرده تا بهترین مطالب و فیلمهای آموزشی را به صورت چکیده و در عین حال بسیار کامل در اختیار کاربران خود قرار دهد. تماشای فیلمهای آموزشی فرادرس باعث کاهش هزینهها، افزایش راندمان و یادگیری بهتر میشود. به همین دلیل است که کاربران بسیار زیادی به صورت روزانه از خدمات فرادرس استفاده میکنند.
![مجموعه آموزش ساختمان داده و طراحی الگوریتم – از دروس دانشگاهی تا کاربردی](https://blog.faradars.org/wp-content/uploads/2024/07/Algorithm-design-and-data-structure-series.png)
از بابت طراحی الگوریتم و ساختمان دادهها هم فرادرس اقدام به تولید فیلمهای کاملی کرده است. البته تلاش کردیم که هر دو جنبه علمی و آکادمیک این مباحث را در کنار یکدیگر پوشش دهیم. به همین دلیل در ادامه فیلمهایی را معرفی کردیم که هم حالت کمک درسی برای آزمونهای آکادمیک دارند و هم دارای مطالب بسیار کاربردی در پروژههای روز دنیا هستند. در صورت تمایل برای آشنا شدن با مباحث بیشتر بر روی تصویر بالا کلیک کنید.
- فیلم آموزش ساختمان داده ها به صورت جامع و با نکات مهم در فراردس
- فیلم آموزش طراحی الگوریتم به شکل جامع و با مفاهیم کلیدی در فراردس
- فیلم آموزش طراحی الگوریتم همراه با مرور و تست کنکور ارشد در فراردس
- فیلم آموزش ساختمان داده ها و پیاده سازی در C++ در فراردس
- فیلم آموزش پیشرفته ساختمان داده در کنار حل سوالات کنکور ارشد و دکتری در فراردس
مزایای مرتب سازی تعویضی
مزیت اصلی مرتبسازی تعویضی، سادگی آن است. البته این الگوریتم برای استفاده در مجموعه دادههای بزرگ مناسب نیست. پیچیدگی زمانی مرتبسازی تعویضی در حالتهای میانگین و بدترین برابر بااست. زیرا این الگوریتم در هربار اجرای عملیات مرتبسازی باید به اندازهتعداد مقایسه انجام دهد.
به صورت خلاصه میتوان مزایای استفاده از این الگوریتم را در دو نکته زیر بیان کرد.
- علیرغم ناکارآمدی که این الگوریتم دارد، مرتبسازی تعویضی میتواند برای جاهایی که سادگی الگوریتم با ارزشتر از کارآمدی آن است، مانند مقاصد آموزشی یا مرتبسازی لیستهای کوچک، مفید باشد.
- مزیت دیگر مرتبسازی تعویضی پایداری آن است. به این معنا که ترتیب نسبی عناصر مساوی باهم را حفظ میکند. این مسئله در بعضی از برنامهها و کاربردها میتواند از اهمیت برخوردار باشد. مخصوصا زمانی که رکوردهایی را مرتب میکنیم که خود حاوی چندین بخش جداگانه از اطلاعات هستند.
جمع بندی
الگوریتمهای مرتبسازی از کاربردیترین الگوریتمها در برنامهنویسی و پیادهسازی عملیات کامپیوتری هستند. برای مرتبسازی دادهها انواع گوناگونی الگوریتم معرفی شدهاند. بعضی از الگوریتمهای ساده، مانند مرتبسازی تعویضی، گزینه بسیار خوبی برای شروع آشنایی با الگوریتمها و مخصوصا تکنیکهای پیادهسازی کدهای مربوط به آنها به وسیله زبانهای برنامه نویسیاند. الگوریتم مرتب سازی تعویضی از لحاظ ظاهری شباهت بسیار زیادی به الگوریتم «مرتبسازی حبابی» (Bubble Sort) دارد. اما در بعضی از سناریوها مرتبسازی تعویضی از همتای خود، یعنی الگوریتم مرتبسازی حبابی، به میزان نسبتا کارآمدتری عمل میکند.
در این مطلب از مجله فرادرس، با الگوریتم مرتب سازی تعویضی آشنا شدیم. روش کار این الگوریتم را با کمک شبه کد مربوط به آن درک کردیم. سپس کدهای مرتبسازی تعویضی را با کمک زبانهای برنامهنویسی مختلف، نوشتیم. در نهایت هم پیچیدگی این الگوریتم را تحلیل کرده و مزیتها و موارد استفاده از آن را نیز بررسی کردیم.