힙소트란?

0️⃣1️⃣·2021년 5월 5일
0

알고리즘

목록 보기
3/9

힙소트란?

  • 힙트리의 성질을 이용해서 정렬

  • 시간복잡도는 O(NlogN)이며, 공간복잡도는 O(1)이다.

  • 시간복잡도가 O(NlogN)이지만, 참조 지역성의 원리로 보면 좋다고 할 수 없다.

  • 부모 노드 1개와 자식 노드 2개의 구조를 이룬다.

  • 비안정 정렬

구현 방법?

  • 루트 노드가 왼쪽 서브 트리의 노드들보다 크고 오른쪽 서브 트리의 노드들보다도 큰 맥스힙트리를 만들어줘야 한다.

  • 리프 노드에 가까운 노드들부터 힙트리의 성질을 만족하도록 구현한다.

  • 힙트리의 성질을 만족시키고 난 후, 정렬이 필요하다.

  • 맥스힙트리는 루트 노드가 가장 크므로, 루트 노드를 마지막 노드와 교환한다.

  • 교환된 노드를 제외하고 나머지 노드들로 다시 루트 노드와 교환을 반복적으로 수행하면 된다.

자바 코드?

class Solution {
    void heapify(int[] nums, int idx, int range){
        int left = -1;
        int right = -1;
        int val = idx;
        
        while(true){
            left = 2 * idx + 1;
            right = 2 * idx + 2;
            
            if(left < range && nums[val] < nums[left])
                val = left;
            
            if(right < range && nums[val] < nums[right])
                val = right;
            
            if(val == idx)
                return;
            
            swap(nums, idx, val);
            idx = val;
        }
    }
    
    void swap(int[] nums, int idx1, int idx2){
        int tmp = nums[idx1];
        nums[idx1] = nums[idx2];
        nums[idx2] = tmp;
    }
    
    public int[] sortArray(int[] nums) {
        for(int i = nums.length / 2; i >= 0; i--){
            heapify(nums, i, nums.length);
        }

        for(int i = nums.length - 1; i >= 0; i--){
            swap(nums, 0, i);
            heapify(nums, 0, i);
        }
        
        return nums;
    }
}

시간복잡도 계산법?

  • heapify 함수는 트리의 높이인 O(logN)의 시간복잡도가 발생한다.

  • heapify 함수를 통해서 최대 N개의 데이터들을 다루고 있으므로 O(NlogN)이다.

  • 항상 O(NlogN)의 시간복잡도를 가진다.

0개의 댓글