1. 程式人生 > >堆排序(HeapSort)---php實現

堆排序(HeapSort)---php實現

原理:

由輸入的無序陣列構造一個最大堆,作為初始的無序區 把堆頂元素(最大值)和堆尾元素互換 把堆(無序區)的尺寸縮小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));