排序演算法之堆排序

2021-10-09 08:56:02 字數 2212 閱讀 6396

堆排序是指利用堆這種資料結構所設計的一種排序演算法。堆是乙個近似完全二叉樹的的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或大於)它的父結點。

思路:1、將待排序序列構造成乙個大頂堆

2、此時,整個序列的最大值就是堆頂的根節點

3、將其與末尾元素進行交換,此時末尾就為最大值

4、然後將剩餘n-1個元素重新構造成乙個堆,這樣就會得到n個元素的次小值。如此反覆執行,便能得到乙個有序序列了

注:每個結點的值都大於或等於其左右子結點的值,稱為大頂堆

每個結點的值都小於或等於其左右子結點的值,稱為小頂堆

小頂堆(降序)

<?php 

//因為是陣列,下標從0開始,所以,下標為n根結點的左子結點為2n+1,右子結點為2n+2;

//初始化值,建立初始堆

$arr=array(49,38,65,97,76,13,27,50);

$arrsize=count($arr);

//將第一次排序抽出來,因為最後一次排序不需要再交換值了。

buildheap($arr,$arrsize);

for($i=$arrsize-1;$i>0;$i--)

print_r($arr);

//用陣列建立最小堆

function buildheap(&$arr,$arrsize)

}//將子結點中較小的和父結點比較,若子結點較小,與父結點交換位置,同時更新較小

if($arr[$min]}}

}//此函式用來交換下陣列$arr中下標為$one和$another的資料

function swap(&$arr,$one,$another)

?>

大頂堆(公升序)

<?php 

/*** 將陣列初始化構建堆

* 從最後乙個非葉子節點開始,遞迴到第0個, index = n/2 -1

* */

function buildheap(&$arr)

}/**

* 交換頭尾,在構建堆

* */

function sortheap(&$arr)

//交換頭尾後,按照堆規則,重新構建堆

adjustheap($arr,0,$i);

$k++;}}

/*** 按照堆規則,重新構建堆

* * @param int $parentindex

* @param int $length

*/function adjustheap(&$arr,$parentindex,$length)

if ($arr[$parentindex] >= $arr[$childindex])

$temp = $arr[$parentindex];

$arr[$parentindex] = $arr[$childindex];

$arr[$childindex] = $temp;

$parentindex = $childindex;

$childindex = 2*$parentindex + 1;}}

/***

* 用來做特殊除錯的

* @param int $parentindex

* @param int $length

*/function adjustheap1(&$arr,$parentindex,$length)

if ($arr[$parentindex] >= $arr[$childindex])

$temp = $arr[$parentindex];

$arr[$parentindex] = $arr[$childindex];

$arr[$childindex] = $temp;

$parentindex = $childindex;

$childindex = 2*$parentindex + 1;}}

$arr = [20,50,10,30,70,20,80];

buildheap($arr);

sortheap($arr);

print_r($arr);

?>

排序演算法之堆排序

前言 今天我來介紹下堆排序,在寫堆排序 之前,我們要知道堆的概念!堆的定義 n個關鍵字序列kl,k2,kn稱為 heap 當且僅當該序列滿足如下性質 簡稱為堆性質 1 ki k 2i 且ki k 2i 1 1 i n 當然,這是小根堆,大根堆則換成 號。k i 相當於二叉樹的非葉子結點,k 2i 則...

排序演算法之堆排序

堆排序演算法是選擇排序的一種,該演算法只是通過堆,最大堆 或者最小堆選擇出乙個待排序序列中的最大值,或者最小值。要想實現堆排序演算法,就需要構建什麼堆,這裡也最小堆為例。說明什麼是堆,怎麼構建乙個堆。假設待排序序列為a n 為乙個陣列。陣列的長度為n 陣列下標為 0,1,2,i,2i,2i 1 n ...

排序演算法之堆排序

宣告 本博文 為樓主親自編寫並測試,其它內容引用至我一直很崇拜的牛人morewindows。他對排序演算法的講解通俗易懂,給人一種耳目一新的感覺。堆排序與快速排序 歸併排序 一樣都是時間複雜度為o n logn 的幾種常見排序方法。最小堆的講解以及最小堆元素的插入和刪除參見最小堆操作。以下繼續引用以...