Swift Coding Test Course, Merge Sort

Hello. Today, we will learn about the Merge Sort algorithm implemented in Swift. This tutorial will start from the basics of Merge Sort and explain its application in actual coding tests in detail.

What is Merge Sort?

Merge Sort is a sorting algorithm based on the divide and conquer strategy. It divides the array into two halves, sorts each sub-array, and then merges the two sorted sub-arrays into one sorted array. Merge Sort has an average and worst-case time complexity of O(n log n) and is a stable sort.

Principle of Merge Sort

The process of Merge Sort is as follows:

  1. Given the original array, it is split into two sub-arrays at the midpoint.
  2. Merge Sort is recursively performed on each sub-array.
  3. The two sorted sub-arrays are merged to create one sorted array.

The important point here is that the sub-arrays are sorted at each step. The entire array is sorted by merging these sorted arrays back together.

Problem: Sort Integers

Write a function in Swift that sorts a given list of integers in ascending order. An example input is as follows:


            let nums = [38, 27, 43, 3, 9, 82, 10]
        

To solve this problem, you need to apply the principles of Merge Sort explained above.

Implementing Merge Sort

Now, let’s implement Merge Sort in Swift. Below is the complete code:


            func mergeSort(_ array: [Int]) -> [Int] {
                // 1. If the size of the array is less than 1, return the original array
                if array.count < 2 {
                    return array
                }
                
                // 2. Split the array at the midpoint
                let midIndex = array.count / 2
                let leftArray = mergeSort(Array(array[0..<midindex])) let="" rightarray="mergeSort(Array(array[midIndex..<array.count]))" return="" merge(leftarray,="" rightarray)="" }="" func="" merge(_="" left:="" [int],="" _="" right:="" [int])="" -=""> [Int] {
                var mergedArray: [Int] = []
                var leftIndex = 0
                var rightIndex = 0
                
                // 4. Merge by comparing the two arrays
                while leftIndex &lt; left.count &amp;&amp; rightIndex &lt; right.count {
                    if left[leftIndex] &lt; right[rightIndex] {
                        mergedArray.append(left[leftIndex])
                        leftIndex += 1
                    } else {
                        mergedArray.append(right[rightIndex])
                        rightIndex += 1
                    }
                }
                
                // 5. Add remaining elements
                while leftIndex &lt; left.count {
                    mergedArray.append(left[leftIndex])
                    leftIndex += 1
                }
                
                while rightIndex &lt; right.count {
                    mergedArray.append(right[rightIndex])
                    rightIndex += 1
                }
                
                return mergedArray
            }

            // Main
            let nums = [38, 27, 43, 3, 9, 82, 10]
            let sortedNums = mergeSort(nums)
            print(sortedNums) // Result: [3, 9, 10, 27, 38, 43, 82]
        </midindex]))>

The above code sorts the input list of numbers using Merge Sort and prints the result. Comments are added at each step to aid understanding.

Code Explanation

Let's take a look at the code line by line:

  1. if array.count < 2 { return array }: If the size of the array is less than 1, it is already sorted, so it is returned as is.
  2. let midIndex = array.count / 2: Calculates the midpoint index of the array.
  3. let leftArray = mergeSort(Array(array[0..<midindex]))< code="">: Recursively sorts the left sub-array.</midindex]))<>
  4. <li><code>let rightArray = mergeSort(Array(array[midIndex..<array.count]))< code="">: Recursively sorts the right sub-array.</array.count]))<></code></li><code> <li><code>return merge(leftArray, rightArray)</code>: Merges the sorted left and right arrays and returns the result.</li> </code>
<code> <p>In the merge function, indices are tracked as the two arrays are compared and merged. If one array is exhausted, the remaining elements are added to produce the final result.</p> </code>
<code> <section> <h2>Advantages and Disadvantages of Merge Sort</h2> <p>Merge Sort has the following advantages and disadvantages:</p> <h3>Advantages:</h3> <ol> <li>Stable sorting: The relative order of elements with equal values is preserved.</li> <li>Time complexity of O(n log n): It provides a relatively fast sorting performance proportional to the amount of data.</li> <li>Can be applied to linked lists as well as arrays of fixed size: It can be used in structures that utilize pointers.</li> </ol> <h3>Disadvantages:</h3> <ol> <li>Requires additional memory: Because a new array is created during the merging process, the space complexity is O(n).</li> <li>In simpler cases (e.g., nearly sorted cases), simpler algorithms like insertion sort may perform better.</li> </ol> </section> <section> <h2>Additional Problems for Skill Improvement</h2> <p>Now that you understand Merge Sort, practice further with these additional problems:</p> <ol> <li>Write a function that takes an array of integers and returns a sorted array with duplicates removed.</li> <li>Implement an algorithm that finds the index of an element with a specific value in a sorted array using binary search.</li> <li>Write a function in Swift that merges multiple input arrays into one sorted array.</li> </ol> </section> <footer> <p>This concludes our discussion on implementing Merge Sort in Swift. It is important to solidify your understanding of basic data structures and algorithm theories when solving algorithm problems. We will meet again in the next tutorial with more in-depth content. Thank you!</p> </footer> <p></p> <div id="jp-relatedposts" class="jp-relatedposts"> <h3 class="jp-relatedposts-headline"><em>관련</em></h3> </div> </code>
<code> <footer class="entry-footer"> <span class="byline"><span class="author vcard"><img alt="" src="https://secure.gravatar.com/avatar/5b7f47db621d1eab02540d35048be506?s=49&amp;d=mm&amp;r=g" srcset="https://secure.gravatar.com/avatar/5b7f47db621d1eab02540d35048be506?s=98&amp;d=mm&amp;r=g 2x" class="avatar avatar-49 photo" height="49" width="49" decoding="async"><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://atmokpo.com/w/en/author/root/">root</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://atmokpo.com/w/34740/" rel="bookmark"><time class="entry-date published" datetime="2024-11-01T09:31:28+00:00">2024/11/01</time><time class="updated" datetime="2024-11-01T11:26:45+00:00">2024/11/01</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://atmokpo.com/w/category/swift-coding-test/" rel="category tag">Swift Coding Test</a></span> </footer><!-- .entry-footer --> </code>
<code> <nav class="navigation post-navigation" aria-label="Posts"> <h2 class="screen-reader-text">Post navigation</h2> <div class="nav-links"><div class="nav-previous"><a href="https://atmokpo.com/w/34738/" rel="prev"><span class="meta-nav" aria-hidden="true">Previous</span> <span class="screen-reader-text">Previous post:</span> <span class="post-title">Swift Coding Test Course, Bellman-Ford</span></a></div><div class="nav-next"><a href="https://atmokpo.com/w/34742/" rel="next"><span class="meta-nav" aria-hidden="true">Next</span> <span class="screen-reader-text">Next post:</span> <span class="post-title">Swift Coding Test Course, I Will Become the President of the Women’s Association</span></a></div></div> </nav> </code>
<code> </code>
<code> <aside id="secondary" class="sidebar widget-area"> <section id="block-2" class="widget widget_block widget_search"><form role="search" method="get" action="https://atmokpo.com/w/en/" class="wp-block-search__button-outside wp-block-search__text-button wp-block-search"><label class="wp-block-search__label" for="wp-block-search__input-1">Search</label><div class="wp-block-search__inside-wrapper "><input class="wp-block-search__input" id="wp-block-search__input-1" placeholder="" value="" type="search" name="s" required=""><button aria-label="Search" class="wp-block-search__button wp-element-button" type="submit">Search</button></div></form></section><section id="block-10" class="widget widget_block"><ul class="wp-block-page-list"><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/c-coding-test-tutorials/">C++ Coding Test Tutorials</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/collection-of-c-coding-test-tutorials/">Collection of C# Coding Test Tutorials</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/deep-learning-automated-trading/">Deep learning Automated trading</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/deep-learning-natural-language-processing/">Deep learning natural language processing</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/english-sentence-study/">English sentence study</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/flutter-course/">Flutter course</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/gan-deep-learning-course/">GAN deep learning course</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/java-android-app-development/">Java Android app development</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/java-coding-test/">Java Coding Test</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/javascript-coding-test/">Javascript Coding Test</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/kotlin-android-app-development/">Kotlin Android app development</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/kotlin-coding-test/">Kotlin coding test</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/python-auto-trading/">Python Auto Trading</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/python-coding-test/">Python Coding Test</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/python-study/">Python Study</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/pytorch-study/">PyTorch Study</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/react-basics-course/">React basics course</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/spring-boot-backend-development/">Spring Boot backend development</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/swift-coding-test/">Swift Coding Test</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/swift-iphone-app-development-swiftui/">Swift iPhone app development (SwiftUI)</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/swift-iphone-app-development-uikit/">Swift iPhone app development (UIKit)</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/unity-basic/">Unity Basic</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/using-hugging-face/">Using Hugging Face</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/uwp-programming/">UWP Programming</a></li><li class="wp-block-pages-list__item"><a class="wp-block-pages-list__item__link" href="https://atmokpo.com/w/wpf-programming/">WPF Programming</a></li></ul></section><section id="listcategorypostswidget-3" class="widget widget_listcategorypostswidget"><h2 class="widget-title">Category Post List</h2><ul class="lcp_catlist" id="lcp_instance_listcategorypostswidget-3"><li><a href="https://atmokpo.com/w/34836/">Swift Coding Test Course, Making an Integer 1</a></li><li><a href="https://atmokpo.com/w/34834/">Swift Coding Test Course, Implementing Absolute Value Heap</a></li><li><a href="https://atmokpo.com/w/34832/">Swift Coding Test Course, Finding the Critical Path</a></li><li><a href="https://atmokpo.com/w/34830/">Swift Coding Test Course, Finding Binomial Coefficient 2</a></li><li><a href="https://atmokpo.com/w/34828/">Swift Coding Test Course, Finding Binomial Coefficient 1</a></li><li><a href="https://atmokpo.com/w/34826/">Swift Coding Test Course, Find the Number of Colloquial Expressions</a></li><li><a href="https://atmokpo.com/w/34824/">Swift Coding Test Course, Binary Tree</a></li><li><a href="https://atmokpo.com/w/34822/">Swift Coding Test Course, Binary Search</a></li><li><a href="https://atmokpo.com/w/34820/">Swift Coding Test Course, Binary Graph Discrimination</a></li><li><a href="https://atmokpo.com/w/34818/">Swift Coding Test Course, Euclidean Algorithm</a></li></ul><ul class="lcp_paginator"><li><a href="https://atmokpo.com/w/34740/?lcp_pagelistcategorypostswidget-3=4#lcp_instance_listcategorypostswidget-3" title="4" class="lcp_prevlink">&lt;&lt;</a></li><li><a href="https://atmokpo.com/w/34740/?lcp_pagelistcategorypostswidget-3=1#lcp_instance_listcategorypostswidget-3" title="1">1</a></li><li><a href="https://atmokpo.com/w/34740/?lcp_pagelistcategorypostswidget-3=2#lcp_instance_listcategorypostswidget-3" title="2">2</a></li><li><a href="https://atmokpo.com/w/34740/?lcp_pagelistcategorypostswidget-3=3#lcp_instance_listcategorypostswidget-3" title="3">3</a></li><li><a href="https://atmokpo.com/w/34740/?lcp_pagelistcategorypostswidget-3=4#lcp_instance_listcategorypostswidget-3" title="4">4</a></li><li class="lcp_currentpage">5</li><li><a href="https://atmokpo.com/w/34740/?lcp_pagelistcategorypostswidget-3=6#lcp_instance_listcategorypostswidget-3" title="6">6</a></li><li><a href="https://atmokpo.com/w/34740/?lcp_pagelistcategorypostswidget-3=7#lcp_instance_listcategorypostswidget-3" title="7">7</a></li><li><a href="https://atmokpo.com/w/34740/?lcp_pagelistcategorypostswidget-3=8#lcp_instance_listcategorypostswidget-3" title="8">8</a></li><li><a href="https://atmokpo.com/w/34740/?lcp_pagelistcategorypostswidget-3=9#lcp_instance_listcategorypostswidget-3" title="9">9</a></li><li><a href="https://atmokpo.com/w/34740/?lcp_pagelistcategorypostswidget-3=10#lcp_instance_listcategorypostswidget-3" title="10">10</a></li><span class="lcp_elipsis">...</span><li><a href="https://atmokpo.com/w/34740/?lcp_pagelistcategorypostswidget-3=14#lcp_instance_listcategorypostswidget-3" title="14">14</a></li><li><a href="https://atmokpo.com/w/34740/?lcp_pagelistcategorypostswidget-3=6#lcp_instance_listcategorypostswidget-3" title="6" class="lcp_nextlink">&gt;&gt;</a></li></ul></section><section id="block-3" class="widget widget_block"> <div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow"> <h3 class="wp-block-heading">최신 글</h3> <ul class="wp-block-latest-posts__list wp-block-latest-posts"><li><a class="wp-block-latest-posts__post-title" href="https://atmokpo.com/w/37979/">Unity 2D Game Development, Create a Platform Game Including Jumps, Obstacles, and Enemies.</a></li> <li><a class="wp-block-latest-posts__post-title" href="https://atmokpo.com/w/37977/">Unity 2D Game Development, Adding Effects Using Particle System Implementing visual effects such as explosions and flames using the particle system.</a></li> <li><a class="wp-block-latest-posts__post-title" href="https://atmokpo.com/w/37973/">Unity 2D Game Development, Touch Input and Mobile Game Development Creation of 2D games utilizing touch input on mobile devices.</a></li> <li><a class="wp-block-latest-posts__post-title" href="https://atmokpo.com/w/37975/">Unity 2D Game Development, Power-Up and Buff System Creating a power-up system that temporarily enhances the player’s abilities.</a></li> <li><a class="wp-block-latest-posts__post-title" href="https://atmokpo.com/w/37971/">Unity 2D Game Development, Quest and Mission System Creating a quest system where rewards are given for achieving specific goals.</a></li> </ul></div></div> </section> </aside><!-- .sidebar .widget-area --> </code>
<code> <footer id="colophon" class="site-footer"> <div class="site-info"> <span class="site-title"><a href="https://atmokpo.com/w/en/" rel="home">라이브스마트</a></span> <a href="https://wordpress.org/" class="imprint"> Proudly powered by WordPress </a> </div><!-- .site-info --> </footer><!-- .site-footer --> </code>
<code> </code>
<code> <link rel="stylesheet" id="lcp_paginator-css" href="https://atmokpo.com/w/wp-content/plugins/list-category-posts//lcp_paginator.css?ver=6.7.2" media="all"> <script src="https://atmokpo.com/w/wp-content/plugins/collapse-magic/js/collapse-magic.js?x=53&amp;ver=1.0" id="claps-main-js"></script> <script defer="" src="https://atmokpo.com/w/wp-content/plugins/koko-analytics/assets/dist/js/script.js?ver=1.6.4" id="koko-analytics-js"></script> <script src="https://atmokpo.com/w/wp-content/plugins/responsive-accordion-and-collapse/js/accordion-custom.js?ver=6.7.2" id="call_ac-custom-js-front-js"></script> <script src="https://atmokpo.com/w/wp-content/plugins/responsive-accordion-and-collapse/js/accordion.js?ver=6.7.2" id="call_ac-js-front-js"></script> <script src="https://stats.wp.com/e-202515.js" id="jetpack-stats-js" data-wp-strategy="defer"></script> <script id="jetpack-stats-js-after"> _stq = window._stq || []; _stq.push([ "view", JSON.parse("{\"v\":\"ext\",\"blog\":\"238449126\",\"post\":\"34740\",\"tz\":\"0\",\"srv\":\"atmokpo.com\",\"j\":\"1:14.2.1\"}") ]); _stq.push([ "clickTrackerInit", "238449126", "34740" ]); </script> <script> document.querySelectorAll("code").forEach(function(codeBlock) { // 내용에 '<'나 '>'가 포함된 경우에만 변환 if (codeBlock.innerHTML.includes("<") && codeBlock.innerHTML.includes(">")) { codeBlock.textContent = codeBlock.innerHTML; } }); </script></code>