php常見的幾種排序以及二分法查詢

2022-03-24 10:03:32 字數 2737 閱讀 3719

<?php

1.插入排序

思想:

每次將乙個待排序的資料元素插入到前面已經排好序的數列中,使數列依然有序,知道待排序資料元素全部插入完為止。

示例:

[初始關鍵字] [49] 38 65 97 76 13 27 49

j=2(38) [38 49] 65 97 76 13 27 49

j=3(65) [38 49 65] 97 76 13 27 49

j=4(97) [38 49 65 97] 76 13 27 49

j=5(76) [38 49 65 76 97] 13 27 49

j=6(13) [13 38 49 65 76 97] 27 49

j=7(27) [13 27 38 49 65 76 97] 49

j=8(49) [13 27 38 49 49 65 76 97]

時間複雜度:

如果目標是把n個元素的序列公升序排列,那麼採用插入排序存在最好情況和最壞情況。最好情況就是,序列已經是公升序排列了,在這種情況下,需要進行的比較操作需(n-1)次即可。最壞情況就是,序列是降序排列,那麼此時需要進行的比較共有n(n-1)/2次。插入排序的賦值操作是比較操作的次數加上 (n-1)次。平均來說插入排序演算法的時間複雜度為o(n^2)。因而,插入排序不適合對於資料量比較大的排序應用。但是,如果需要排序的資料量很小,例如,量級小於千,那麼插入排序還是乙個不錯的選擇。

//插入排序

function insertsort($arr)

}return  $arr;

2.選擇排序

思想:每一趟從待排序的資料元素中選出最小(或最大)的乙個元素,順序放在已排好序的數列的最後,直到全部待排序的資料元素排完。

示例:

[初始關鍵字] [49 38 65 97 76 13 27 49]

第一趟排序後 13 [38 65 97 76 49 27 49]

第二趟排序後 13 27 [65 97 76 49 38 49]

第三趟排序後 13 27 38 [97 76 49 65 49]

第四趟排序後 13 27 38 49 [49 97 65 76]

第五趟排序後 13 27 38 49 49 [97 97 76]

第六趟排序後 13 27 38 49 49 76 [76 97]

第七趟排序後 13 27 38 49 49 76 76 [ 97]

最後排序結果 13 27 38 49 49 76 76 97

時間複雜度:

時間複雜度為o(n2),不穩定排序,適合規模比較小的

//選擇排序

function selectsort($arr)

$temp=$arr[$i];

$arr[$i]=$arr[$k];

$arr[$k]=$temp;

}return $arr;

}3.氣泡排序

思想:

兩兩比較待排序資料元素的大小,發現兩個資料元素的次序相反時即進行交換,直到沒有反序的資料元素為止。

示例:

49 13 13 13 13 13 13 13 

38 49 27 27 27 27 27 27

65 38 49 38 38 38 38 38

97 65 38 49 49 49 49 49

76 97 65 49 49 49 49 49

13 76 97 65 65 65 65 65

27 27 76 97 76 76 76 76

49 49 49 76 97 97 97 97

時間複雜度:

該演算法的時間複雜度為o(n2)。但是,當原始關鍵字序列已有序時,只進行一趟比較就結束,此時時間複雜度為o(n)。

//氣泡排序

function bubblesort($arr)

} if(! $flag)//本趟排序未發生交換,提前終止演算法

return $arr;

}//return $arr;

}4.快速排序

思想:

通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

時間複雜度:

快速排序主體演算法時間運算量約 o(log2n) ,劃分子區函式運算量約 o(n) ,所以總的時間複雜度為 o(nlog2n) ,它顯然優於氣泡排序 o(n2). 可是演算法的優勢並不是絕對的。試分析,當原檔案關鍵字有序時,快速排序時間複雜度是 o(n2), 這種情況下快速排序不快。而這種情況的氣泡排序是 o(n), 反而很快。在原檔案記錄關鍵字無序時的多種排序方法中,快速排序被認為是最好的一種排序方法。

//快速排序

function quicksort($arr)

$arr = array(1, 3, 5, 6, 7, 8, 10, 12, 14, 16, 18, 20);

$value = 8;

echo binarysearch($arr, $value);

php陣列排序(二分法)

近日,看到一關於php陣列排序的問題,居然在瞬間沒有想出如何實現!真的是有點丟分呢。於是想起csdn上曾有一篇文章說過只有20 的人能夠實現二分查詢,看來我在那20 之外了 於是想了一下,得出以下實現演算法,供大家借鑑。class sortnum function desctruct public ...

二分法排序C

首先說一下二分法排序的原理,演算法思想簡單描述 在插入第i個元素時,對前面的0 i 1元素進行折半,先跟他們 中間的那個元素比,如果小,則對前半再進行折半,否則對後半 進行折半,直到left right,然後再把第i個元素前1位與目標位置之間 的所有元素後移,再把第i個元素放在目標位置上。二分法排序...

利用二分法排序

include int main 將array陣列的前兩個數按大小賦給new陣列的前兩個元素 new 0 array 0 array 1 array 0 array 1 new 1 array 0 array 1 array 0 array 1 m 2 新陣列new的有效個數 for i 2 i 1...