資料結構與演算法之PHP排序演算法(歸併排序)

2022-03-18 01:02:28 字數 2063 閱讀 3401

一、基本思想

歸併排序演算法是將兩個(或兩個以上)有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,使每個子串行有序,再將已有序的子串行合併,得到完全有序的序列。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。

二、演算法過程

歸併主要做兩件事:

1)「分解」——將序列每次折半劃分。

2)「合併」——將劃分後的序列段兩兩合併後排序。

三、演算法**及php**實現

1、遞迴——自頂向下

遞迴過程是將待排序陣列一分為二,直至排序陣列就剩下乙個元素為止,然後不斷的合併兩個排好序的陣列

其中,合併過程如下(以第2趟歸併為例):

php**如下:

<?php

//遞迴

function mergesort(&$arr, $left, $right) }

//將兩個有序陣列合併成乙個有序陣列

function merge(&$arr, $left, $mid, $right

) else

}//比完之後,假如左陣列仍有剩餘,則直接全部複製到 temp 陣列

while ($i

<= $mid

)

//比完之後,假如右陣列仍有剩餘,則直接全部複製到 temp 陣列

while ($j

<= $right

)

//將合併序列複製到原始序列中

for($k = 0; $k

< count($temp); $k++) }

//測試

$arr = [85, 24, 63, 45, 17, 31, 96];

mergesort(

$arr, 0, count($arr) - 1);

print_r($arr);

2、非遞迴——自底向上

非遞迴過程是將待排序陣列看成n個長度為1的子串行,陣列中的相鄰元素兩兩配對,將他它們排序後,構成n/2組長度為2的排序好的子陣列段,然後再將他們排序成長度為4的子陣列段,如此繼續下去,直至整個陣列排好序。

不管遞迴還是非遞迴,其合併的邏輯都是一樣的。

php**如下:

<?php

//非遞迴

function msort(&$arr

)

//呼叫歸併函式,進行分割的序列的分段排序

merge($arr, $left, $mid, $right

);

$left = $right + 1;

}$size *= 2; //

範圍擴大一倍}}

//將兩個有序陣列合併成乙個有序陣列

function merge(&$arr, $left, $mid, $right

) else

}//比完之後,假如左陣列仍有剩餘,則直接全部複製到 temp 陣列

while ($i

<= $mid

)

//比完之後,假如右陣列仍有剩餘,則直接全部複製到 temp 陣列

while ($j

<= $right

)

//將合併序列複製到原始序列中

/*for($k = 0; $k < count($temp); $k++)

*/for ($i = $left, $k = 0; $i

<= $right; $i++, $k++) }

//測試

$arr = [85, 24, 63, 45, 17, 31, 96, 1];

msort(

$arr

);print_r($arr);

四、效率分析

1、時間複雜度:o(nlogn)

最好情況、最壞情況和平均時間複雜度均為o(nlogn);

2、空間複雜度:o(n)

演算法處理過程中,需要乙個大小為 n 的臨時儲存空間儲存合併序列,所以空間複雜度為o(n)。

3、穩定性:穩定

在歸併排序中,相等的元素的順序不會改變,所以它是穩定排序。

資料結構與演算法之PHP排序演算法(堆排序)

一 堆的定義 堆通常是乙個可以被看做一棵樹的陣列物件,其任一非葉節點滿足以下性質 1 堆中某個節點的值總是不大於或不小於其父節點的值 每個節點的值都大於或等於其左右子節點的值,稱為大頂堆。即 arr i arr 2i 1 arr i arr 2i 2 或 每個節點的值都小於或等於其左右子節點的值,稱...

資料結構與演算法之排序

三 演算法效能 二 七種排序演算法 資料結構之線性表 資料結構之鍊錶 資料結構之串 資料結構之圖 資料結構之排序演算法 對n個資料執行某種操作,使其按照某種規則有序的排列,這樣的操作就是排序。內排序與外排序 按照排序過程中資料是否全放在記憶體中,可以分為內排序和外排序 交插選並 其中內排序又分為插入...

《資料結構與演算法》之排序

資料結構與演算法 之鍊錶 資料結構與演算法 之鏈棧 資料結構與演算法 之佇列 資料結構與演算法 之二分查詢 資料結構與演算法 之二叉樹 如果你是一名程式設計師,或多或少你都了解過 聽說過排序。在專案中我們也會經常用到排序,排序非常重要,現在我在這裡分享一些經典的排序演算法。先附上demo位址 氣泡排...