Daily LeetCode Challenge - 912. Sort an Array

Min Young Kim·2023년 3월 1일
0

algorithm

목록 보기
81/198

Problem From.

https://leetcode.com/problems/sort-an-array/

오늘 문제는 여러가지 정렬 알고리즘 중에 하나를 선택해서 푸는 문제였다.

문제의 제한사항에 O(nlog(n)) 의 시간복잡도를 가지는 정렬 알고리즘을 사용하여 풀으라고 되어있으므로, merge sort (합병 정렬) 을 사용하여 문제를 풀었다.

합병 정렬은 분할과 정복을 활용하여 정렬을 하는 알고리즘으로, 배열을 작은 조각들로 나눈다음 정렬을 하고 다시 합치면서 정렬을 하게된다.

class Solution {
  
    fun sortArray(nums: IntArray): IntArray {
      val work = IntArray(nums.size)
      dfs(0, nums.size - 1, nums, work)
      return nums
    }
  
    private fun dfs(from: Int, to: Int, nums: IntArray, work: IntArray) {
        if (from == to) return
        val mid = (from + to) / 2
        dfs(from, mid, nums, work)
        dfs(mid + 1, to, nums, work)

        var i = from
        var j = mid + 1
        nums.copyInto(work, from, from, to + 1)
        var idx = from
        while (i <= mid && j <= to)
          nums[idx++] = if (work[i] <= work[j]) work[i++] else work[j++]
        while (i <= mid)
          nums[idx++] = work[i++]
        while (j <= to)
          nums[idx++] = work[j++]
    }
  
}
profile
길을 찾는 개발자

0개의 댓글