2026, 새로운 도약을 시작합니다.

[알고리즘]힙 정렬(Heap Sort)

· 9년 전 · 310

<?php

class Heap {

    var $numOfData;

    var $heapArr = array();

    var $comp;

    function __construct($pc) {// 힙의 초기화

        $this->numOfData = 0;

        $this->comp = $pc;

    }

    function HIsEmpty() {// 힙이 비었는지 확인

        if ($this->numOfData == 0)

            return TRUE;

        else

            return FALSE;

    }

    function GetParentIDX($idx) {// 부모 노드의 인덱스 값 반환

        return floor($idx/2);

    }

    function GetLChildIDX($idx) {// 왼쪽 자식 노드의 인덱스 값 반환

        return $idx*2;

    }

    function GetRChildIDX($idx) {// 오른쪽 자식 노드의 인덱스 값 반환

        return $this->GetLChildIDX($idx)+1;

    }

// 두 개의 자식 노드중 높은 우선 순위의 자식 노드 인덱스 값 반환

    function GetHiPriChildIDX($idx) {

        if ($this->GetLChildIDX($idx) > $this->numOfData)

            return 0;

        else if ($this->GetLChildIDX($idx) == $this->numOfData)

            return $this->GetLChildIDX($idx);

        else

        {

            $comp = $this->comp;

            if ($comp($this->heapArr[$this->GetLChildIDX($idx)],

                $this->heapArr[$this->GetRChildIDX($idx)]) < 0)

                return $this->GetRChildIDX($idx);

            else

                return $this->GetLChildIDX($idx);

        }

    }

// 힙에 데이터 저장

    function HInsert($data) {

        $idx = $this->numOfData+1;

        $comp = $this->comp;

        while ($idx != 1) {

            if($comp($data, $this->heapArr[$this->GetParentIDX($idx)]) > 0) {

                $this->heapArr[$idx] = $this->heapArr[$this->GetParentIDX($idx)];

                $idx = $this->GetParentIDX($idx);

            }

            else

                break;

        }

        $this->heapArr[$idx] = $data;

        $this->numOfData += 1;

    }

// 힙에서 데이터 삭제

    function HDelete() {

        $retData = $this->heapArr[1];

        $lastElem = $this->heapArr[$this->numOfData];

        $parentIdx = 1;

        $childIdx;

        $comp = $this->comp;

        while ($childIdx = $this->GetHiPriChildIDX($parentIdx)) {

            if ($comp($lastElem, $this->heapArr[$childIdx]) >= 0)

                break;

            $this->heapArr[$parentIdx] = $this->heapArr[$childIdx];

            $parentIdx = $childIdx;

        }

        $this->heapArr[$parentIdx] = $lastElem;

        $this->numOfData -= 1;

        return $retData;

    }

}

$arr = array(3, 4, 2, 1);

// 오름차순

function PriorityComp($d1, $d2) {

    return $d2 - $d1;

}

$heap = new Heap(PriorityComp);

foreach ($arr as $val)

$heap->HInsert($val);

foreach ($arr as $k => $v) 

$arr[$k] = $heap->Hdelete();

print_r($arr);

?>


|

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

프로그램

번호 제목 글쓴이 날짜 조회
8230 9년 전 조회 18
8229 9년 전 조회 25
8228 9년 전 조회 62
8227 9년 전 조회 72
8226 9년 전 조회 115
8225 9년 전 조회 100
8224 9년 전 조회 92
8223 9년 전 조회 54
8222 9년 전 조회 126
8221 9년 전 조회 38
8220 9년 전 조회 35
8219 9년 전 조회 38
8218 9년 전 조회 73
8217 9년 전 조회 51
8216 9년 전 조회 101
8215 9년 전 조회 56
8214 9년 전 조회 175
8213 9년 전 조회 116
8212 9년 전 조회 22
8211 9년 전 조회 191
8210 9년 전 조회 181
8209 9년 전 조회 281
8208 9년 전 조회 154
8207 9년 전 조회 171
8206 9년 전 조회 127
8205 9년 전 조회 119
8204 9년 전 조회 75
8203 9년 전 조회 168
8202 9년 전 조회 97
8201 9년 전 조회 137
8200 9년 전 조회 94
8199 9년 전 조회 149
8198 9년 전 조회 123
8197 9년 전 조회 102
8196 9년 전 조회 480
8195 9년 전 조회 103
8194 9년 전 조회 238
8193 9년 전 조회 108
8192 9년 전 조회 134
8191 9년 전 조회 87
8190 9년 전 조회 83
8189 9년 전 조회 140
8188 9년 전 조회 70
8187 9년 전 조회 91
8186 9년 전 조회 101
8185 9년 전 조회 260
8184 9년 전 조회 56
8183 9년 전 조회 286
8182 9년 전 조회 116
8181 9년 전 조회 82
8180 9년 전 조회 647
8179 9년 전 조회 443
8178 9년 전 조회 248
8177 9년 전 조회 253
8176 9년 전 조회 298
8175 9년 전 조회 172
8174 9년 전 조회 178
8173 9년 전 조회 295
8172 9년 전 조회 138
8171 9년 전 조회 137
8170 9년 전 조회 245
8169 9년 전 조회 214
8168 9년 전 조회 263
8167 9년 전 조회 274
8166 9년 전 조회 188
8165 9년 전 조회 128
8164 9년 전 조회 247
8163 9년 전 조회 235
8162 9년 전 조회 244
8161 9년 전 조회 233
8160 9년 전 조회 436
8159 9년 전 조회 340
8158 9년 전 조회 162
8157 9년 전 조회 307
8156 9년 전 조회 219
8155 9년 전 조회 201
8154 9년 전 조회 541
8153 9년 전 조회 174
8152 9년 전 조회 346
8151 9년 전 조회 356
8150 9년 전 조회 445
8149 9년 전 조회 283
8148 9년 전 조회 112
8147 9년 전 조회 331
8146 9년 전 조회 386
8145 9년 전 조회 305
8144 9년 전 조회 272
8143 9년 전 조회 125
8142 9년 전 조회 377
8141 9년 전 조회 326
8140 9년 전 조회 868
8139 9년 전 조회 192
8138 9년 전 조회 339
8137 9년 전 조회 316
8136 9년 전 조회 683
8135 9년 전 조회 721
8134 9년 전 조회 437
8133 9년 전 조회 386
8132 9년 전 조회 400
8131 9년 전 조회 753
🐛 버그신고