الگوریتم های مرتب سازی در سوئیفت (Swift) — به زبان ساده

۹۷ بازدید
آخرین به‌روزرسانی: ۲۸ شهریور ۱۴۰۲
زمان مطالعه: ۳ دقیقه
الگوریتم های مرتب سازی در سوئیفت (Swift) — به زبان ساده

مرتب‌سازی یکی از مفاهیم ضروری برای مدیریت داده‌ها محسوب می‌شود. داده‌های مرتب شده امکان اجرای مؤثرتر الگوریتم‌ها را فراهم می‌سازند. هدف ما از مرتب‌سازی این است که از یک وضعیت بی‌نظمی به وضعیت منظم برسیم. این کار از طرق چیدمان داده‌ها با یک توالی منطقی به دست می‌آید، به طوری که می‌توانیم بفهمیم اطلاعات را از کجا بیابیم. این توالی‌ها را به راحتی می‌توان با استفاده از نوع داده صحیح (Integer) به دست آورد؛ اما در این مسیر می‌توان از کاراکترها (یعنی حروف الفبا) و دیگر مجموعه‌ها مانند اعداد باینری، هگزادسیمال و مشابه نیز بهره جست. در این نوشته با الگوریتم های مرتب سازی در سوئیفت آشنا خواهیم شد. در مثال‌های زیر، از تکنیک‌های مختلفی برای مرتب‌سازی یک آرایه استفاده می‌کنیم.

1//array of unsorted integers
2let numberList : Array<Int> = [8, 2, 10, 9, 7, 5]

برای یک لیست کوتاه، بصری‌سازی مسئله، امری ساده است. برای چیدمان مجموعه به صورت یک دنباله منظم می‌توانیم یک «ناوردا» (Invariant) پیاده‌سازی کنیم. ناورداها فرضیاتی را نمایش می‌دهند که در تمام طول اجرا بدون تغییر می‌مانند. برای این که ببینید این وضعیت چگونه کار می‌کند، الگوریتم مرتب‌سازی ادغامی را ملاحظه کنید.

مرتب‌سازی ادغامی

«مرتب‌سازی ادغامی» (INSERTION SORT) یکی از ابتدایی‌ترین الگوریتم‌ها در علوم رایانه به حساب می‌آید.

این الگوریتم عناصر را از طریق تکرار یک چرخه روی یک مجموعه و تعیین موقعیت عناصر بر اساس ارزششان رتبه‌بندی می‌کند. این مجموعه به دو نیمه مرتب و نامرتب تقسیم می‌شود و این کار تا زمانی که همه عناصر مرتب‌سازی شوند تداوم می‌یابد:

1extension Array where Element: Comparable {
2 
3 func insertionSort() -> Array<Element> {
4        
5        //check for trivial case
6        guard self.count > 1 else {
7            return self
8        }
9        
10        //mutated copy        
11        var output: Array<Element> = self
12        
13        for primaryindex in 0..<output.count {
14            
15            let key = output[primaryindex]
16            var secondaryindex = primaryindex
17            
18            while secondaryindex > -1 {
19                if key < output[secondaryindex] {
20                    
21                    //move to correct position
22                    output.remove(at: secondaryindex + 1)
23                    output.insert(key, at: secondaryindex)
24                }
25                
26                secondaryindex -= 1
27            }            
28        }
29        
30        return output        
31    }   }
32//execute sort
33let results: Array<Int> = numberList.insertionSort()

مرتب‌سازی حبابی

«مرتب‌سازی حبابی» (BUBBLE SORT) یک تکنیک مرتب‌سازی رایج دیگر است. این تکنیک نیز مانند مرتب‌سازی ادغامی حاصل ترکیب یک سری مراحل با یک ناوردا است. این تابع با ارزیابی جفت مقدارها عمل می‌کند. زمانی که مقایسه صورت بگیرد، موقعیت بزرگ‌ترین مقدار با کوچک‌ترین مقدار تعویض می‌شود. هنگامی که این کار به دفعات کافی صورت بگیرد، تأثیر این «حباب سازی» خود را نشان می‌دهد و در نهایت همه عناصر در لیست مرتب‌سازی می‌شوند:

1extension Array where Element: Comparable {
2func bubbleSort() -> Array<Element> {
3                
4        //check for trivial case
5        guard self.count > 1 else {
6            return self
7        }
8                
9        //mutated copy
10        var output: Array<Element> = self        
11        
12        for primaryIndex in 0..<self.count {                        
13            let passes = (output.count - 1) - primaryIndex
14                        
15            //"half-open" range operator
16            for secondaryIndex in 0..<passes {                
17                let key = output[secondaryIndex]                                
18                
19                //compare / swap positions
20                if (key > output[secondaryIndex + 1]) {
21                  output.swapAt(secondaryIndex, secondaryIndex + 1)
22                }
23            }
24        }
25                
26        return output        
27    }
28}
29//execute sort
30let results: Array<Int> = numberList.bubbleSort()

مرتب‌سازی انتخابی

«مرتب‌سازی انتخابی» (SELECTION SORT) نیز همانند مرتب‌سازی حبابی به رتبه‌بندی عناصر از طریق تعریف چرخه‌ای روی یک مجموعه و تعویض مکان عناصر بر اساس مقدارشان عمل می‌کند. مجموعه به نیمه‌های مرتب و نامرتب تقسیم می‌شود و این فرایند تا زمانی که همه عناصر مرتب‌سازی شوند ادامه می‌یابد:

1extension Array where Element: Comparable {
2func selectionSort() -> Array<Element> {     
3        
4        //check for trivial case
5        guard self.count > 1 else {
6            return self
7        }        
8        
9        //mutated copy
10        var output: Array<Element> = self
11                
12        for primaryindex in 0..<output.count {
13                        
14            var minimum = primaryindex
15            var secondaryindex = primaryindex + 1
16                        
17            while secondaryindex < output.count {
18         
19          //store lowest value as minimum
20                if output[minimum] > output[secondaryindex] {
21                    minimum = secondaryindex
22                }                
23                secondaryindex += 1
24            }
25            
26            
27            //swap minimum value with array iteration
28            if primaryindex != minimum {
29            output.swapAt(primaryindex, minimum)
30            }            
31        }
32                
33        return output        
34    }
35}
36//execute sort
37let results: Array<Int> = numberList.selectionSort()

علاوه بر روش‌های مرتب‌سازی درجی، انتخابی و حبابی، الگوریتم‌های مرتب‌سازی زیاد دیگری نیز وجود دارند. همان طور که می‌دانید ساختمان‌های داده درخت جستجوی دودویی و «هیپ» (Heap) نیز به فرایند مرتب‌سازی عناصر کمک می‌کنند؛ اما این کار را به عنوان بخشی از فرایند درج انجام می‌دهند.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۱ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
swift-algorithms-data-structures
نظر شما چیست؟

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