php中對於數組的排序方法是有很多種的,每種數組排序也都有各自不同的原理,下面就來具體看一下關於快速排序演算法,歸併排序演算法以及插入排序演算法的樣本。
異形數組的遍曆
求如下數組中數位平均值:
$arr1 = array(1, 2, array(31, 32, 33), 4,array(51, 52, 53, array(541, 542, 543, 544) ),6, array(71, 72, 73),);$count = 0; //計數$sum = GetArraySum($arr1);echo “\
快速排序演算法
原理描述:
對於這樣一個數組:[5, 1,2, 6,7];
取出第一項(並作為中間數組),並將其餘項與其對比後,分為兩個數組:
左邊數組項比中間項小,右邊數組不比中間項小。
如果左邊數組和右邊數組已經是排好序的數組,則將這3者合并起來,就是最終結果。
如果左邊數組和右邊數組還不是排好序的數組,則繼續遞迴使用本函數擷取有序數組。
原理圖:
原理性資料:
$arr1 = [5, 2, 1, 6,7]; //有力說明原理的資料1
小的:[2, 1], 大的:[6, 7], 中間的: [5]
將三者合并: [1, 2, 5, 6, 7];
$arr1 = [2, 1]; //有力說明原理的資料2
中間:[2], 左邊:[1] , []
具體案例:
$arr1 = [5, 2, 4, 6, 1, 3];$arr1 = [5, 2, 4, 6, 1, 3];//$arr1 = [5, 3, 2, 8, 7];echo “\
插入排序演算法
原理描述:
對於這樣一個數組:[2, 3, 4, 1];
要將某個數n插入到一個已經排好序的數組中,
只要將n跟這個數組的項從後往前一個一個對比,只要發現某項比n大,
就將該項後移一位,然後繼續往前取出並對比,比n大就往後移動一位,以此類推。
最後沒有比n大的時候,就把n放入到剛才往後移動時空出來的那個位置上。
對於一個數組,第1項就可以當做一個“已經排好序”的數組,
則第2項就可以遵照上述原理來進行“插入排序”,於是前兩個就可以排好,
並成為了具有兩個元素的“排好序的數組”。後續以此類推。
原理圖:
原理資料:
$arr1 = [2, 3, 4, 1]; //有力說明原理的資料1
$arr1 = [2, 3, 1]; //有力說明原理的資料2
$arr1 = [2, 1]; //有力說明原理的資料3
$arr1 = [1, 2]; //有力說明原理的資料3
具體案例:
$arr1 = [5, 2, 4, 6, 1, 3];$arr1 = [2, 3, 4, 1];$arr1 = [2, 4, 5, 6, 1, 3];echo “\
歸併排序演算法
原理描述:
對於這樣的一個數組: $arr1 = [1, 3, 5, 2, 4, 6];將其一分為二:$a = [1, 3, 5],
$b = [2, 4, 6];
如果有兩個各自已經排好序的數組,則對這兩個數組進行如下操作後,就可以獲得一個排好序的這兩個數組的“溶合數組”:
取出數組a的第一項a1,再取出數組b的第一項b1,比較a1和b1的大小,
並將小的(假設為a1)放入一個新數組,並去刪除對應數組a的第一項,
而後再取出對應數組的第一項(不是剛才的那個資料了),而後繼續將兩者對比大小
每次都放入小的到新數組中,並繼續下一次的“刪除,取數,對比”。。。。
這樣之後最終的結果是,新的數組中就可以得到一個新的排好序的數組。
對於尚未排好序的數組,只要對其以遞迴方式繼續“一分為二”地分割,最終會得到最短數組——只有一個或0個單元,這種數組自然是排好序的了。
原理圖:
原理資料:
$arr1 = [1, 3, 5, 4, 6, 7, 8 ]; //有力說明原理的資料1
從中間一份為2: [ ]; [ 6, 7, 8]
[ 1, 3, 4, 5, ]
$arr1 = [1, 3, 2, 4]; //有力說明原理的資料2
示範案例:
$arr1 = [5, 2, 4, 6, 1, 3];echo “\