日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

PHP 实现归并排序算法

發布時間:2024/4/14 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PHP 实现归并排序算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

算法原理

下列動圖來自@五分鐘學算法,演示了歸并算法的原理和步驟。

原理:

利用遞歸,先拆分、后合并、再排序。

步驟:

  • 均分數列為兩個子數列
  • 遞歸重復上一步驟,直到子數列只有一個元素
  • 父數列合并兩個子數列并排序,遞歸返回數列

代碼實現

// 歸并排序主程序 function mergeSort($arr) {$len = count($arr);if ($len <= 1) {return $arr;} // 遞歸結束條件, 到達這步的時候, 數組就只剩下一個元素了, 也就是分離了數組$mid = intval($len / 2); // 取數組中間$left = array_slice($arr, 0, $mid); // 拆分數組0-mid這部分給左邊left$right = array_slice($arr, $mid); // 拆分數組mid-末尾這部分給右邊right$left = mergeSort($left); // 左邊拆分完后開始遞歸合并往上走$right = mergeSort($right); // 右邊拆分完畢開始遞歸往上走$arr = merge($left, $right); // 合并兩個數組,繼續遞歸return $arr; }// merge函數將指定的兩個有序數組(arrA, arr)合并并且排序 function merge($arrA, $arrB) {$arrC = array();while (count($arrA) && count($arrB)) {// 這里不斷的判斷哪個值小, 就將小的值給到arrC, 但是到最后肯定要剩下幾個值,// 不是剩下arrA里面的就是剩下arrB里面的而且這幾個有序的值, 肯定比arrC里面所有的值都大所以使用$arrC[] = $arrA[0] < $arrB[0] ? array_shift($arrA) : array_shift($arrB);}return array_merge($arrC, $arrA, $arrB); }

測試:

$startTime = microtime(1);$arr = range(1, 10); shuffle($arr);echo "before sort: ", implode(', ', $arr), "\n"; $sortArr = mergeSort($arr); echo "after sort: ", implode(', ', $sortArr), "\n";echo "use time: ", microtime(1) - $startTime, "s\n";

時間復雜度

歸并排序的時間復雜度是 O(N*lgN)。

假設被排序的數列中有 N 個數。遍歷一趟的時間復雜度是 O(N),需要遍歷多少次呢?

歸并排序的形式就是一棵二叉樹,它需要遍歷的次數就是二叉樹的深度,而根據完全二叉樹的可以得出它的時間復雜度是 O(N*lgN)。

參考資料

  • 歸并排序
  • 十大經典排序算法動畫與解析

感謝您的閱讀,覺得內容不錯,點個贊吧 ?

原文地址: https://shockerli.net/post/me...

總結

以上是生活随笔為你收集整理的PHP 实现归并排序算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。