歸併排序
時間複雜度屬於o(nlogn)
級別的,相比於o(n^2)
級別的排序演算法,在處理大的資料量時,它的優勢非常明顯,下面通過原理圖和**演示介紹歸併排序是如何實現o(nlogn)
時間複雜度級別的。
在學習歸併排序
之前,先學習一下使用臨時空間
將陣列中有序的兩個
部分歸併成乙個
有序部分的原理圖
tips:需要額外使用空間,最後將排好序的值賦值給原來的變數中。合併**如下:
<?php
function twomergesort($arr,$left,$mid,$right)else
}for ($i = 0;$i < ($right - $left);$i++)
return $arr;
}$arr = [1,4,7,10,15,8,11,13,19,24];
print_r(twomergesort($arr,0,5,9));
/**array
( [0] => 1
[1] => 4
[2] => 7
[3] => 8
[4] => 10
[5] => 11
[6] => 13
[7] => 15
[8] => 19
[9] => 24
) */
可以使用遞迴二分的思想把乙個無序的陣列分解為多個單元素的陣列(單元素陣列也可以看做有序陣列)
tips:可以採用遞迴的思想實現歸併排序。
<?php
class mergesort
else
}for ($i = 0;$i < ($right - $left);$i++)
return $arr;
}public function arraymergesort($arr)
private function recursionmergesort($arr,$left,$right)
$mid = ceil((($right - $left)/2) + $left);//($right + $left)/2 這種考慮記憶體溢位的優化
$arr = $this->recursionmergesort($arr,$left,$mid-1); //遞迴思想,交給下層處理排序
$arr = $this->recursionmergesort($arr,$mid,$right);//遞迴思想,交給下層處理排序
$arr = $this->twomergesort($arr,$left,$mid,$right);//merge 兩部有序內容
return $arr;}}
<?php
//require 'merge_arr.php';
require 'mergesort.php';
$mergesort = new mergesort();
print_r($mergesort->arraymergesort([1,3,2,4,5,9,6,7,8]));
如下圖所示:
**倉庫 :
掃碼關注愛因詩賢
php實現歸併排序
歸併排序是建立在歸併操作上的一種有效的排序演算法,該演算法是分治法的乙個典型應用。將已有序的子串行合併,得到完全有序的序列,即先使每個子串行有序,在使子串行段間有序。若將兩個有序表合併為乙個有序表,稱為二路歸併。如圖,從下往上,每一步都需將兩個已經有序的子串行合併成乙個大的有序陣列 合併兩個有序陣列...
PHP 實現歸併排序演算法
下列 來自 五分鐘學演算法,演示了歸併演算法的原理和步驟。原理 利用遞迴,先拆分 後合併 再排序。步驟 歸併排序主程式 function mergesort arr 遞迴結束條件,到達這步的時候,陣列就只剩下乙個元素了,也就是分離了陣列 mid intval len 2 取陣列中間 left arr...
PHP 實現歸併排序演算法
下列 來自 五分鐘學演算法,演示了歸併演算法的原理和步驟。原理 利用遞迴,先拆分 後合併 再排序。步驟 歸併排序主程式 function mergesort arr 遞迴結束條件,到達這步的時候,陣列就只剩下乙個元素了,也就是分離了陣列 mid intval len 2 取陣列中間 left arr...