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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php常用的四种排序算法

發布時間:2024/9/20 php 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)。因而,插入排序不適合對于數據量比較大的排序應用。但是,如果需要排序的數據量很小,例如,量級小于千,那么插入排序還是一個不錯的選擇。

代碼:


[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.選擇排序

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

    示例:

    [初始關鍵字] [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),不穩定排序,適合規模比較小的

    代碼

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

    代碼

    [php] view plaincopyprint?
  • //冒泡排序(一維數組)?????
  • 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.快速排序

    思想:

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

    示例:

    ?

    初始關鍵字 [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
    最后的排序結果 13 27 38 49 49 65 76 97

    時間復雜度:

    快速排序主體算法時間運算量約 O(log2n),劃分子區函數運算量約 O(n),所以總的時間復雜度為 O(nlog2n),它顯然優于冒泡排序 O(n2).可是算法的優勢并不是絕對的。試分析,當原文件關鍵字有序時,快速排序時間復雜度是 O(n2),這種情況下快速排序不快。而這種情況的冒泡排序是 O(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) 待排序的元素數目n;
    (2) 元素本身信息量的大小;
    (3) 關鍵字的結構及其分布情況;
    (4) 語言工具的條件,輔助空間的大小等。
    2. 小結:
    (1) 若n較小(n <= 50),則可以采用直接插入排序或直接選擇排序。由于直接插入排序所需的記錄移動操作較直接選擇排序多,因而當記錄本身信息量較大時,用直接選擇排序較好。
    (2) 若文件的初始狀態已按關鍵字基本有序,則選用直接插入或冒泡排序為宜。
    (3) 若n較大,則應采用時間復雜度為O(nlog2n)的排序方法:快速排序、堆排序或歸并排序。 快速排序是目前基于比較的內部排序法中被認為是最好的方法。
    (4) 在基于比較排序方法中,每次比較兩個關鍵字的大小之后,僅僅出現兩種可能的轉移,因此可以用一棵二叉樹來描述比較判定過程,由此可以證明:當文件的n個關鍵字隨機分布時,任何借助于"比較"的排序算法,至少需要O(nlog2n)的時間。
    (5) 當記錄本身信息量較大時,為避免耗費大量時間移動記錄,可以用鏈表作為存儲結構。


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

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。