Ausführliche Erklärung zur Implementierung der Heap-Sortierung in PHP

黄舟
Freigeben: 2023-03-06 17:48:02
Original
1534 Leute haben es durchsucht

Definition von Heap:

n Schlüsselwortsequenzen Kl, K2,...,Kn werden genau dann (Heap) genannt, wenn This Die Sequenz erfüllt die folgenden Eigenschaften (kurz: Heap-Eigenschaften): (1) ki<=k(2i) und ki<=k(2i+1)(1≤i≤n/2). Heap: Der große Root-Heap wird durch das >=-Zeichen ersetzt. k(i) entspricht dem Nicht-Blattknoten des Binärbaums, K(2i) ist der linke untergeordnete Knoten und k(2i+1) ist der rechte untergeordnete Knoten. Wenn der in dieser Sequenz gespeicherte Vektor R[1..n] als Speicherstruktur eines vollständigen Binärbaums betrachtet wird, ist der Heap im Wesentlichen ein vollständiger Binärbaum, der die folgenden Eigenschaften erfüllt: den Schlüssel eines beliebigen Nicht-Blattknotens in Der Baum ist ein Schlüsselwort, das nicht größer (oder nicht kleiner als) seine linken und rechten untergeordneten Knoten (falls vorhanden) ist.

/**
 * 调整堆
 * @param array $arr	排序数组
 * @param int $i    	待调节元素的下标
 * @param int $size 	数组大小, 准确来说是数组最大索引值加1
 */
function heapAjust(& $arr, $i, $size)
{
	$key = $arr[$i];
	// 索引从0开始
	// 左孩子节点为 2i+1, 右孩子节点为 2i+2
	for($j = 2 * $i + 1; $j < $size; $j = 2 * $j + 1) {
		if($j + 1 < $size && $arr[$j] < $arr[$j + 1])
			$j++;
		if($key > $arr[$j])
			break ;
		$arr[$i] = $arr[$j]; //调换值
		$i = $j;
	}
	$arr[$i] = $key;
}

/**
 * 堆排序
 * 时间复杂度:O(nlogn)
 * 不稳定的排序算法
 */
function heapSort(& $arr)
{
	$len = count($arr);
	
	// 构建初始大根堆
	for($i = intval($len/2); $i >= 0; $i--) {
		heapAjust($arr, $i, $len);
	}

	// 调换堆顶元素和最后一个元素
	for($j = $len - 1; $j > 0; $j--) {
		$swap = $arr[0];
		$arr[0] = $arr[$j];
		$arr[$j] = $swap;
		heapAjust($arr, 0, $j); //继续调整剩余元素为大根堆
	}
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonAusführliche Erklärung zur Implementierung der Heap-Sortierung in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!