الگوریتم های مرتب سازی در سوئیفت (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 (سوئیفت) برای برنامه نویسی iOS
- مجموعه آموزش های مهندسی نرم افزار
- آموزش آرایه در برنامه نویسی Swift (سوئیفت)
- آرایه ها در زبان برنامه نویسی سوئیفت (Swift) — به زبان ساده
- آموزش برنامه نویسی سوئیفت (Swift): متغیر، ثابت و انواع داده
==