일단 시작해보는 블로그

[알고리즘_개념] 힙 정렬, Heap Sort 본문

CS/자료구조

[알고리즘_개념] 힙 정렬, Heap Sort

Selina Park 2019. 8. 25. 16:44

힙정렬 알고리즘은 

입력받은 숫자를 최대 혹은 최소 힙 구조로 만들고 현재 값 중에 가장 큰값 혹은 작은 값을 루트로부터 추출하여 큰값부터 차례대로 뽑아 정렬문제를 해결하는 알고리즘이다.

 

아래 동영상이 도움이 많이 됐다아ㅏ.!!!

LOGIC

1. 배열에 담기

2. max-heapify

3. 1번노드와 마지막 노드 exchange

4. 마지막 노드를 arraylist에 따로 담기, heap크기 = heap크기 -1

 

  

 

 

package data_structure;

import java.util.ArrayList;

// max heap!
public class HeapSort {
    static ArrayList<Integer> sortArr = new ArrayList<>();
    static int[] swap(int[] a, int m, int n){
        int tmp = 0;

        tmp = a[m];
        a[m] = a[n];
        a[n] = tmp;

        return a;
    }

    static int[] maxHeapify(int[] a){
        int start = a.length/2;
        for(int i=start; i>=1; i--){
            //System.out.println(2*i + " " + (2*i+1));
            if(2*i < a.length && a[i] <= a[2*i]) { a = swap(a, i, 2*i); }
            if((2*i)+1 < a.length && a[i] <= a[(2*i)+1]) {
                a = swap(a, i, (2*i)+1);
            }
        }
        return a;
    }

    static int[] exchange_1_n(int[] a){
        int arrLength = a.length-1;

        a = swap(a, 1, arrLength);
        sortArr.add(a[arrLength]);

        int[] noneMaxHeap = new int[arrLength];

        for(int i=1; i<arrLength; i++){
            noneMaxHeap[i] = a[i];
        }

        return noneMaxHeap;
    }

    public static void main(String[] args) {
        int[] a = {0, 16, 14, 10, 8, 7, 9, 3, 2, 4, 1};

        for(int ai : a){
          System.out.print(ai + " ");
        }
        System.out.println();

        int end = a.length-1;

        for(int i=0; i<end; i++){
            a = maxHeapify(a);
            a = exchange_1_n(a);
        }
        
        System.out.println(sortArr);
    }
}

 

 

 

[REFERENCE]

https://www.youtube.com/watch?v=ehNVf2Bcm2Q

https://www.youtube.com/watch?v=S42s_ANn4c4

 

Comments