日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

php常用的四种排序算法

發(fā)布時間:2024/9/20 php 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php常用的四种排序算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

純當(dāng)練習(xí),高手請繞過。以一維數(shù)組為例。

1.插入排序

思想:

每次將一個待排序的數(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]

時間復(fù)雜度:

如果目標(biāo)是把n個元素的序列升序排列,那么采用插入排序存在最好情況和最壞情況。最好情況就是,序列已經(jīng)是升序排列了,在這種情況下,需要進(jìn)行的比較操作需(n-1)次即可。最壞情況就是,序列是降序排列,那么此時需要進(jìn)行的比較共有n(n-1)/2次。插入排序的賦值操作是比較操作的次數(shù)加上(n-1)次。平均來說插入排序算法的時間復(fù)雜度為O(n^2)。因而,插入排序不適合對于數(shù)據(jù)量比較大的排序應(yīng)用。但是,如果需要排序的數(shù)據(jù)量很小,例如,量級小于千,那么插入排序還是一個不錯的選擇。

代碼:


[php] view plaincopyprint?
  • </pre><pre?name="code"?class="php">function?insert_sort($arr){?????
  • ????$count?=?count($arr);?????
  • ????for($i=1;?$i<$count;?$i++){?????
  • ????????$tmp?=?$arr[$i];?????
  • ????????$j?=?$i?-?1;?????
  • ????????while($arr[$j]?>?$tmp){?????
  • ????????????$arr[$j+1]?=?$arr[$j];?????
  • ????????????$arr[$j]?=?$tmp;?????
  • ????????????$j--;?????
  • ?????????}?????
  • ?????}?????
  • ????return?$arr;?????
  • }????

  • 2.選擇排序

    思想:每一趟從待排序的數(shù)據(jù)元素中選出最小(或最大)的一個元素,順序放在已排好序的數(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

    時間復(fù)雜度:

    時間復(fù)雜度為o(n2),不穩(wěn)定排序,適合規(guī)模比較小的

    代碼

    [php] view plaincopyprint?
  • function?selectsort($arr){??
  • $num?=?count($arr);??
  • for?($i=0;?$i?<?$num-1;?$i++)?{??
  • //先假設(shè)最小位置??
  • $p?=?$i;??
  • for?($k=$i+1;?$k<$num;?$k++)?{??
  • //最小值跟當(dāng)前值的比較??
  • if($arr[$p]>$arr[$k]){??
  • $p?=?$k;??
  • }??
  • }??
  • //如果最小值不是當(dāng)前位置,把最小值放到當(dāng)前位置??
  • if($p!=$i){??
  • $tmp?=?$arr[$p];??
  • $arr[$p]?=?$arr[$i];??
  • $arr[$i]?=?$tmp;??
  • }??
  • }??
  • return?$arr;??
  • }??


  • 3.冒泡排序

    思想:

    兩兩比較待排序數(shù)據(jù)元素的大小,發(fā)現(xiàn)兩個數(shù)據(jù)元素的次序相反時即進(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

    時間復(fù)雜度:

    該算法的時間復(fù)雜度為O(n2)。但是,當(dāng)原始關(guān)鍵字序列已有序時,只進(jìn)行一趟比較就結(jié)束,此時時間復(fù)雜度為O(n)

    代碼

    [php] view plaincopyprint?
  • //冒泡排序(一維數(shù)組)?????
  • function?bubble_sort($array){?????
  • ????$count?=?count($array);?????
  • ????if?($count?<=?0)?return?false;?????
  • ????for($i=0;?$i<$count;?$i++){?????
  • ????????for($j=$count-1;?$j>$i;?$j--){?????
  • ????????????if?($array[$j]?<?$array[$j-1]){?????
  • ????????????????$tmp?=?$array[$j];?????
  • ????????????????$array[$j]?=?$array[$j-1];?????
  • ????????????????$array[$j-1]?=?$tmp;?????
  • ?????????????}?????
  • ?????????}?????
  • ?????}?????
  • ????return?$array;?????
  • }???


  • 4.快速排序

    思想:

    通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個排序過程可以遞歸進(jìn)行,以此達(dá)到整個數(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

    時間復(fù)雜度:

    快速排序主體算法時間運(yùn)算量約 O(log2n),劃分子區(qū)函數(shù)運(yùn)算量約 O(n),所以總的時間復(fù)雜度為 O(nlog2n),它顯然優(yōu)于冒泡排序 O(n2).可是算法的優(yōu)勢并不是絕對的。試分析,當(dāng)原文件關(guān)鍵字有序時,快速排序時間復(fù)雜度是 O(n2),這種情況下快速排序不快。而這種情況的冒泡排序是 O(n),反而很快。在原文件記錄關(guān)鍵字無序時的多種排序方法中,快速排序被認(rèn)為是最好的一種排序方法。

    代碼:

    [php] view plaincopyprint?
  • function?quick_sort($array){?????
  • ??if?(count($array)?<=?1)?return?$array;??????
  • ????
  • ??$key?=?$array[0];?????
  • ??$left_arr?=?array();?????
  • ??$right_arr?=?array();?????
  • ??for?($i=1;?$i<count($array);?$i++){?????
  • ????if?($array[$i]?<=?$key)?????
  • ??????$left_arr[]?=?$array[$i];?????
  • ????else????
  • ??????$right_arr[]?=?$array[$i];?????
  • ??}?????
  • ??$left_arr?=?quick_sort($left_arr);?????
  • ??$right_arr?=?quick_sort($right_arr);??????
  • ????
  • ??return?array_merge($left_arr,?array($key),?$right_arr);?????
  • }???


  • 幾種排序算法的比較和選擇
    1. 選取排序方法需要考慮的因素:
    (1) 待排序的元素數(shù)目n;
    (2) 元素本身信息量的大小;
    (3) 關(guān)鍵字的結(jié)構(gòu)及其分布情況;
    (4) 語言工具的條件,輔助空間的大小等。
    2. 小結(jié):
    (1) 若n較小(n <= 50),則可以采用直接插入排序或直接選擇排序。由于直接插入排序所需的記錄移動操作較直接選擇排序多,因而當(dāng)記錄本身信息量較大時,用直接選擇排序較好。
    (2) 若文件的初始狀態(tài)已按關(guān)鍵字基本有序,則選用直接插入或冒泡排序為宜。
    (3) 若n較大,則應(yīng)采用時間復(fù)雜度為O(nlog2n)的排序方法:快速排序、堆排序或歸并排序。 快速排序是目前基于比較的內(nèi)部排序法中被認(rèn)為是最好的方法。
    (4) 在基于比較排序方法中,每次比較兩個關(guān)鍵字的大小之后,僅僅出現(xiàn)兩種可能的轉(zhuǎn)移,因此可以用一棵二叉樹來描述比較判定過程,由此可以證明:當(dāng)文件的n個關(guān)鍵字隨機(jī)分布時,任何借助于"比較"的排序算法,至少需要O(nlog2n)的時間。
    (5) 當(dāng)記錄本身信息量較大時,為避免耗費(fèi)大量時間移動記錄,可以用鏈表作為存儲結(jié)構(gòu)。


    來源:http://blog.csdn.net/everysii/article/details/52366252

    總結(jié)

    以上是生活随笔為你收集整理的php常用的四种排序算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。