[Sort]ヒップの位置合わせ(heap sort)


ヒープソート

  • 連結ソートの問題
  • は、ソートされたレコードの数に比例する、追加の記憶領域
  • が必要である.
  • の最大Hipツリーまたは最小Hipツリーを並べ替える方法
  • を構成する.
  • 降順に配置最大HIP、昇順に配置最小HIP配置
  • 入力リスト:(26、5、77、1、61、11、59、15、48、19)


  • 最大ヒップ構造を作る

  • ヒフの1枚目と最後のレコードを交換する
  • の最大キーを有するレコードは、配列の正しい位置
  • に位置する.

  • お尻を小さくしてお尻を再調整します
  • ヒップ位置合わせ解析

  • は、追加の記憶領域
  • を必要とする.
  • 最悪の場合の計算時間と平均計算時間:O(nlogn)
  • のマージソートより少し遅い
  • インプリメンテーション

    import java.util.Arrays;
    
    public class Main {
    
        public static void main(String[] args) {
    
            // 정렬 되지 않은 배열
            int[] arr = {26, 5, 77, 1, 61, 11, 59, 15, 48, 19};
    
            /*
             * < maxHeap 만들기 >
             * - 부모노드의 값이 자식노드의 값들보다 큰 형태
             * - i의 초기값은 배열의 제일 끝 자식노드의 부모노드부터 시작한다.
             */
            for(int i=arr.length/2-1;i>=0;i--){
                heapify(arr, arr.length, i);
            }
    
            // 정렬하기
            for(int i=arr.length-1;i>=0;i--){
                swap(arr, i, 0); // 최상단 노드와 최하단 노드 값을 교환한다.
                heapify(arr, i-1, 0); // 루트노드를 기준으로 최대힙을 만든다.
            }
    
            // 출력
            System.out.println(Arrays.toString(arr));
        }
    
        public static void heapify(int[] arr, int size, int pNode){
    
            int parent = pNode; // 부모노드
            int lNode = pNode * 2 + 1; // 왼쪽 자식노드
            int rNode = pNode * 2 + 2; // 오른쪽 자식노드
    
            // size > lNode => 인덱스 범위를 넘어서는지 확인하기 위함
            if(size > lNode && arr[parent] < arr[lNode]){
                parent = lNode;
            }
    
            if(size > rNode && arr[parent] < arr[rNode]){
                parent = rNode;
            }
    
            // parent에 저장된 값은 자식노드 중 큰 값이 있다면 큰 값의 인덱스 값이 남아있을 것이다.
            // 초기에 설정한 부모노드의 인덱스와 다르다면 교환을 해준다.
            if(parent != pNode){
                swap(arr, pNode, parent);
    
                /*
                 * 노드와 자리를 바꾸면 최대힙 기준에 맞지 않을 수 있기 때문에
                 * 바뀐 자식노드 아래 최대힙으로 맞춰주기 위함
                 */
                heapify(arr, size, parent);
            }
        }
    
        public static void swap(int[] arr, int i, int j){
    
            int tmp = arr[j];
            arr[j] = arr[i];
            arr[i] = tmp;
        }
    }
    リファレンス
    高麗(コリョ)大学の金相昆(キム・サンクン)教授講座の
  • [JAVA]ヒップ位置合わせアルゴリズム