堆排序(HeapSort)---php實現
阿新 • • 發佈:2018-12-20
原理:
由輸入的無序陣列構造一個最大堆,作為初始的無序區 把堆頂元素(最大值)和堆尾元素互換 把堆(無序區)的尺寸縮小1,並呼叫heapify(A, 0)從新的堆頂元素開始進行堆調整 重複步驟2,直到堆的尺寸為1
<?php /** * 堆排序 * 資料結構----------------陣列 * 最差時間複雜度-----------O(nlogn) * 最優時間複雜度-----------O(nlogn) * 平均時間複雜度-----------O(nlogn) * 空間複雜度--------------O(1) * 穩定性-----------------不穩定 */ $arr = [1, 3, 34, 2, 32, 2, 78, -43, 53, -35, 0]; $len = count($arr); function Swap(&$arr, $i, $j) { $temp = $arr[$i]; $arr[$i] = $arr[$j]; $arr[$j] = $temp; } // 從$arr[$i]開始向下進行堆調整 function Heapify(&$arr, $i, $heap_size) { $left_child = 2 * $i + 1; // 左孩子索引 $right_child = 2 * $i + 2; // 右孩子索引 $max = $i; // 選出當前結點與其左右孩子死難者之中最大值 if ($left_child < $heap_size && $arr[$left_child] > $arr[$max]) { $max = $left_child; } if ($right_child < $heap_size && $arr[$right_child] > $arr[$max]) { $max = $right_child; } if ($max != $i) { Swap($arr, $i, $max); // 當前結點與最大值進行交換 Heapify($arr, $max, $heap_size); // 遞迴,繼續調整 } } // 建堆,時間複雜度O(n) function BuildHeap(&$arr, $len) { $heap_size = $len; for ($i = floor($heap_size / 2) - 1; $i >= 0; $i--) { // 從每一個非葉子結點開始向下進行堆調整 Heapify($arr, $i, $heap_size); } return $heap_size; } // 堆排序 function HeapSort($arr, $len) { $heap_size = BuildHeap($arr, $len); // 建立最大堆(無序區) while ($heap_size > 1) { // 堆(無序區)元素大於1,未完成排序 Swap($arr, 0, --$heap_size); // 將堆定元素沉到堆底(成為有序區),堆(無序區)-1 Heapify($arr, 0, $heap_size); // 從新的棧頂元素開始向下調整 } return $arr; } print_r(HeapSort($arr, $len));