PHP排序演算法系列之歸併排序詳解_php技巧

來源:互聯網
上載者:User
這篇文章主要為大家詳細介紹了PHP排序演算法系列之歸併排序的相關資料,具有一定的參考價值,感興趣的小夥伴們可以參考一下

歸併排序

歸併排序(MERGE-SORT)是建立在歸併操作上的一種有效排序演算法,該演算法是採用分治法(pide and Conquer)的一個非常典型的應用。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合并成一個有序表,稱為二路歸併。

歸併過程

歸併排序的核心就是如何將兩個有序序列進行合并,假定有兩個有序數組,比較兩個有序數組的首個元素,誰小就取誰,並將該元素放入第三個數組中,取了之後在相應的數組中將刪除此元素,依次類推,當取到一個數組已經沒有元素時,就可將另一數組的剩餘元素直接添加到第三個數組中。

原理

1、將序列每相鄰兩個數字進行歸併操作,形成ceil(n/2)個序列,排序後每個序列包含兩個元素,最後一個序列可能只有一個元素。

2、將上述序列再次歸併,形成ceil(n/4)個序列,每個序列包含四個元素,最後一個序列可能只有三個及以下元素。

3、重複步驟2,直到所有元素排序完畢。

舉例

對數組[53,89,12,6,98,25,37,92,5]進行排序

第一次歸併後

(53,89),12,(6,98),(25,37),(5,92)

第二次歸併後

(12,53,89),(6,25,37,98),(5,92)

第三次歸併後

(6,12,25,37,53,89,98),(5,92)

第四次歸併後

5,6,12,25,37,53,89,92,98

PHP代碼實現


<?phpfunction merge_sort($arr){  $length=count($arr);  if($length<=1){    return $arr;  }  //分解數組,遞迴排序  $half=ceil($length/2);  $arr2=array_chunk($arr,$half);  $left=merge_sort($arr2[0]);  $right=merge_sort($arr2[1]);  while(count($left)&&count($right)){    if($left[0]<$right[0]){      $reg[]=array_shift($left);    }else{      $reg[]=array_shift($right);    }  }  return array_merge($reg,$left,$right);}


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.