php常用的四种排序算法
純當(dāng)練習(xí),高手請繞過。以一維數(shù)組為例。
1.插入排序
思想:
每次將一個(gè)待排序的數(shù)據(jù)元素插入到前面已經(jīng)排好序的數(shù)列中,使數(shù)列依然有序,知道待排序數(shù)據(jù)元素全部插入完為止。
示例:
[初始關(guān)鍵字] [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]
時(shí)間復(fù)雜度:
如果目標(biāo)是把n個(gè)元素的序列升序排列,那么采用插入排序存在最好情況和最壞情況。最好情況就是,序列已經(jīng)是升序排列了,在這種情況下,需要進(jìn)行的比較操作需(n-1)次即可。最壞情況就是,序列是降序排列,那么此時(shí)需要進(jìn)行的比較共有n(n-1)/2次。插入排序的賦值操作是比較操作的次數(shù)加上(n-1)次。平均來說插入排序算法的時(shí)間復(fù)雜度為O(n^2)。因而,插入排序不適合對于數(shù)據(jù)量比較大的排序應(yīng)用。但是,如果需要排序的數(shù)據(jù)量很小,例如,量級小于千,那么插入排序還是一個(gè)不錯(cuò)的選擇。
代碼:
2.選擇排序
思想:每一趟從待排序的數(shù)據(jù)元素中選出最小(或最大)的一個(gè)元素,順序放在已排好序的數(shù)列的最后,直到全部待排序的數(shù)據(jù)元素排完。
示例:
[初始關(guān)鍵字] [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]
最后排序結(jié)果 13 27 38 49 49 76 76 97
時(shí)間復(fù)雜度:
時(shí)間復(fù)雜度為o(n2),不穩(wěn)定排序,適合規(guī)模比較小的
代碼
[php] view plaincopyprint?
3.冒泡排序
思想:
兩兩比較待排序數(shù)據(jù)元素的大小,發(fā)現(xiàn)兩個(gè)數(shù)據(jù)元素的次序相反時(shí)即進(jìn)行交換,直到?jīng)]有反序的數(shù)據(jù)元素為止。
示例:
?
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
時(shí)間復(fù)雜度:
該算法的時(shí)間復(fù)雜度為O(n2)。但是,當(dāng)原始關(guān)鍵字序列已有序時(shí),只進(jìn)行一趟比較就結(jié)束,此時(shí)時(shí)間復(fù)雜度為O(n)。
代碼
[php] view plaincopyprint?
4.快速排序
思想:
通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個(gè)排序過程可以遞歸進(jìn)行,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列。
示例:
?
初始關(guān)鍵字 [49 38 65 97 76 13 27 49]
一趟排序之后 [27 38 13] 49 [76 97 65 49]
二趟排序之后 [13] 27 [38] 49 [49 65]76 [97]
三趟排序之后 13 27 38 49 49 [65]76 97
最后的排序結(jié)果 13 27 38 49 49 65 76 97
時(shí)間復(fù)雜度:
快速排序主體算法時(shí)間運(yùn)算量約 O(log2n),劃分子區(qū)函數(shù)運(yùn)算量約 O(n),所以總的時(shí)間復(fù)雜度為 O(nlog2n),它顯然優(yōu)于冒泡排序 O(n2).可是算法的優(yōu)勢并不是絕對的。試分析,當(dāng)原文件關(guān)鍵字有序時(shí),快速排序時(shí)間復(fù)雜度是 O(n2),這種情況下快速排序不快。而這種情況的冒泡排序是 O(n),反而很快。在原文件記錄關(guān)鍵字無序時(shí)的多種排序方法中,快速排序被認(rèn)為是最好的一種排序方法。
代碼:
[php] view plaincopyprint?幾種排序算法的比較和選擇
1. 選取排序方法需要考慮的因素:
(1) 待排序的元素?cái)?shù)目n;
(2) 元素本身信息量的大小;
(3) 關(guān)鍵字的結(jié)構(gòu)及其分布情況;
(4) 語言工具的條件,輔助空間的大小等。
2. 小結(jié):
(1) 若n較小(n <= 50),則可以采用直接插入排序或直接選擇排序。由于直接插入排序所需的記錄移動操作較直接選擇排序多,因而當(dāng)記錄本身信息量較大時(shí),用直接選擇排序較好。
(2) 若文件的初始狀態(tài)已按關(guān)鍵字基本有序,則選用直接插入或冒泡排序?yàn)橐恕?br /> (3) 若n較大,則應(yīng)采用時(shí)間復(fù)雜度為O(nlog2n)的排序方法:快速排序、堆排序或歸并排序。 快速排序是目前基于比較的內(nèi)部排序法中被認(rèn)為是最好的方法。
(4) 在基于比較排序方法中,每次比較兩個(gè)關(guān)鍵字的大小之后,僅僅出現(xiàn)兩種可能的轉(zhuǎn)移,因此可以用一棵二叉樹來描述比較判定過程,由此可以證明:當(dāng)文件的n個(gè)關(guān)鍵字隨機(jī)分布時(shí),任何借助于"比較"的排序算法,至少需要O(nlog2n)的時(shí)間。
(5) 當(dāng)記錄本身信息量較大時(shí),為避免耗費(fèi)大量時(shí)間移動記錄,可以用鏈表作為存儲結(jié)構(gòu)。
來源:http://blog.csdn.net/everysii/article/details/52366252
總結(jié)
以上是生活随笔為你收集整理的php常用的四种排序算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有什么项目可以投资
- 下一篇: 中证500指数怎么买