搜尋
首頁後端開發php教程php實作幾種常見的排序演算法

php實作幾種常見的排序演算法

Mar 10, 2018 pm 01:34 PM
php排序演算法

交換排序:交換排序的基本思想是,比較兩個記錄鍵值的大小,如果這兩個記錄鍵值的大小出現逆序,則交換這兩個記錄,這樣將鍵值較小的記錄向序列前部移動,鍵值較大的記錄向序列後部移動。




一、冒泡排序        

#介紹:

##氣泡排序(Bubble Sort,台灣譯為:泡沫排序或氣泡排序)是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。

步驟:

  1. #比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

  2. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數字。

  3. 針對所有的元素重複以上的步驟,除了最後一個。

  4. 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

#冒泡排序理解起來是最簡單,但是時間複雜度( O(n^2))也是最大的之一,實作程式碼如下:#

<br/>

  1. $arr=#array(1,43,54,62,21,66 ,32,78,36,76,39);    

  2. function## getpao($arr)  

  3. #{    

  4. $len=count(

  5. #$arr
  6. );    //設定空數組 用來接收冒出來的泡    //此層循環控制 需要冒泡的輪數##​​#  

  7.   for($i

    =1;######$i######
  8.     #for($k=0;##$k$len-$i;$k# ++)  

  9. #    {  

  10. ##       ($arr[$k]>$arr# [$k+1])  

  11. ##        {  
  12. H之一#            $tmp=

    ##$arr
  13. [

    # # +1];  ##            $arr##[$k+1] = $arr[

    $k######];  ##########
  14.             $arr[##$k]=$tmp;  

  15.         }  

  16. #   

  17. ##  }  
  18. #  
  19. return

     $ arr;  

  20. #}   
二、快速排序

 介紹:

快速排序是由東尼·霍爾

所發展的一種排序演算法。在平均狀況下,排序 

n 個項目要進行Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他Ο(n log n) 演算法更快,因為它的內部循環(inner loop)可以大部分的架構上很有效率地被實現出來,且在大部分真實世界的數據,可以決定設計的選擇,減少所需時間的二次方項之可能性。

步驟:

#

  1. 從數列中挑出一個元素,稱為「基準」(pivot),

  2. 重新排序序列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分區退出之後,該基準就處於數列的中間位置。這個稱為分區(partition)操作。

  3. 遞歸地(recursive)將小於基準值元素的子數列和大於基準值元素的子數列排序。

#快排也是一個高效率的排序演算法,它的時間複雜度也是O( nlogn)。程式碼如下:

  1. function# quick_sort($arr) {  

  2.     //先判斷是否需要繼續進行  

  3.     $length = count

    ###(#####$arr######); #####################    ###if######(######$length###### 
  4.         #return $arr##;  

    ##$arr
  5. ;  

  6. #    }      

    //若沒有回,表示在陣列內的元素個數 多餘1個,則需要排序
  7.   

        

    //選擇尺
  8.   

    #    

    //選擇第一個元素
  9.   

        

  10.     
  11. #$base_num

     = $arr[0];  

  12.     #//遍歷 除了尺外的所有元素,依照大小關係放入兩個數組內  

  13. ##        # #//初始化兩個陣列  

  14.     $left_array = array();//小於尺的  

    ############### ###$right_array###### = ######array#######();######//大於尺的######  ##### ####
  15.     for($i=1; $i$length#$i++) {  

  16. #        if($base_num## > $arr# > $arr[$i

  17. ]) {  
  18.             ///放入陣列

  19. ##  
  20.             #$$arrleft_array[] #[$i];  

  21.         } else# {  

  22.             #//放入右側

  23.             $right_array[] = $arr#$i];  

  24. #        }  

  25. #  

  26. #    //再分別對 左邊 和 右邊的陣列進行相同的排序處理方式  

  27. #    //遞迴呼叫這個函數,並記錄結果  

  28. #    $left_array = quick_sort($left_array);  

  29.     $right_array = quick_sort(

    ###$right_array######);  ################# ####    ###//合併左邊 標尺 右邊#######  #########
  30.     return array_merge(#$left_arrayarray($base_num), ##$right_array);  

  31. #}  

#選擇排序




########       選擇排序包括兩種,分別是直接選擇排序和堆疊排序,選擇排序的基本思想是每次在n-i+ 1(i=1,2,3,...,n-1)記錄中選取鍵值最小的記錄作為有序序列的第i個記錄############### #三、選擇排序### #########介紹:#############選擇排序(Selection sort)是一種簡單直覺的######排序演算法######.它的工作原理如下。首先在未排序序列中找出最小元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小元素,然後放到排序序列末端。以此類推,直到所有元素都排序完畢。 #####################選擇排序理解起來也比較簡單,時間複雜度也是O(n^2),實作程式碼如下:###
<br/>
## #############[php]### view plain### copy######################### ##
  1. function# select_sort($arr  

  2. ##//實作想法 雙重循環完成,外層控制輪數,目前的最小值。內層 控制的比較次數      //$i 目前最小值的位置, 則需要參與比較的元素  #    for(#$i =0, $len

    =
  3. count

    ($arr) ; 

    $i
  4. $len-1; ##$i++ ) {  

  •         

    //先假設最小的值的位置  

    ########################################################## ############        ####$p###### = ######$i#######;  ############## ##########        ###//$j 目前都需要哪些元素比較,$i 後邊的。 ######  #########
  •         for($j##=#$i#$i# #+1; $j$len

  • ##$j
  • ++) {  

                
  • //$arr[$p] 是 目前已知的最小值
  • o##H#STST夥計

  • M板雜劑目前。 ##            if(

    #$arr
  • ##(

  • ##$arr
  • $$ p

    ###] > ######$arr######[######$j######]) {  ############################################################################### ############     ###//比較,發現較小的,記錄下最小值的位置;並且下次比較時,######  ######## ############## ###// 應該採用已知的最小值來比較。 ######  #####################                ####$ ##;  #####################            }  ############## 
  •         //已決定了目前的最小值的位置,並儲存到$p。   

  •  //若發現 最小值的位置與目前假設的位置$i不同,則位置互換來  

  • #        if#(#$p != $i) {  

  •            ## = $arr[$p];  

  •             $arr[

    $p
  • #] = 

    $arr

  • $arr#############. [######$i######];  #####################            ###$arr#######[ ######$i######] = ######$tmp######;  ########################### ##        }  ###################    }  ################################################################################################################################################
  •     //傳回最終結果  

  •         # return 

  • $arr
  • ;  

  • }  

    ##四、堆排序

     

    介紹:

    堆積排序(Heapsort)是指利用

    ######這種資料結構所設計的一種排序演算法。堆是近似#########完全二元樹#########的結構,並同時滿足######堆性質######:即子結點的鍵值或索引總是小於(或大於)它的父節點。 ############步驟:###############堆排序是指利用堆積樹(堆)這種資料結構所設計的一種排序演算法,利用數組的特性快速定位指定索引的元素。堆分為大根堆和小根堆,是完全二元樹。大根堆的要求是每個節點的值都不大於其父節點的值,即A[PARENT[i]] >= A[i]。在陣列的非降序排序中,需要使用的就是大根堆,因為根據大根堆的要求可知,最大的值一定在堆頂。 ###############排序效果:#######


    堆排序是一种高效的排序算法,它的时间复杂度是O(nlogn)。原理是:先把数组转为一个最大堆,然后把第一个元素跟第i元素交换,然后把剩下的i-1个元素转为最大堆,然后再把第一个元素与第i-1个元素交换,以此类推。实现代码如下:

    function heapSort($arr) {
        $len = count($arr);    // 先建立最大堆
        for ($i = floor(($len - 1) / 2); $i >= 0; $i--) {        $s = $i;        $childIndex = $s * 2 + 1;        while ($childIndex < $len) {            // 在父、左子、右子中 ,找到最大的
                if ($childIndex + 1 < $len && $arr[$childIndex] < $arr[$childIndex + 1]) $childIndex++;            if ($arr[$s] < $arr[$childIndex]) {                $t = $arr[$s];                $arr[$s] = $arr[$childIndex];                $arr[$childIndex] = $t;                $s = $childIndex;                $childIndex = $childIndex * 2 + 1;
                } else {                break;
                }
            }
        }    // 从最后一个元素开始调整
        for ($i = $len - 1; $i > 0; $i--) {        $t = $arr[$i];        $arr[$i] = $arr[0];        $arr[0] = $t;        // 调整第一个元素
            $s = 0;        $childIndex = 1;        while ($childIndex < $i) {            // 在父、左子、右子中 ,找到最大的
                if ($childIndex + 1 < $i && $arr[$childIndex] < $arr[$childIndex + 1]) $childIndex++;            if ($arr[$s] < $arr[$childIndex]) {                $t = $arr[$s];                $arr[$s] = $arr[$childIndex];                $arr[$childIndex] = $t;                $s = $childIndex;                $childIndex = $childIndex * 2 + 1;
                } else {                break;
                }
            }
        }    return $arr;
    }$arr = [3,1,13,5,7,11,2,4,14,9,15,6,12,10,8];
    print_r(bubbleSort($arr));


    插入排序 

    五、插入排序 

    介绍:

    插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

    步骤:

    1. 从第一个元素开始,该元素可以认为已经被排序

    2. 取出下一个元素,在已经排序的元素序列中从后向前扫描

    3. 如果该元素(已排序)大于新元素,将该元素移到下一位置

    4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置

    5. 将新元素插入到该位置中

    6. 重复步骤2


    感觉插入排序跟冒泡排序有点相似,时间复杂度也是O(n^2),实现代码如下:


    [php] view plain copy


    1. ##function insert_sort(

      #$arr
    2. ) {  

    3. ########################### ######    ###//區分 哪一部分是已排序好的######  #####################    ###/ /哪個部分是沒有排序的######  #####################    ###//找出其中一個需要排序的元素#### ##  #####################    ###//這個元素 就是從第二個元素開始,到最後一個元素都是這個需要排序的元素# #####  #####################    ###//利用迴圈就可以標誌出來#####  ##############  ######## ##############    ###//i循環控制 每次需要插入的元素,一旦需要插入的元素控制了,######  ###### ###############    ###//間接將陣列分成了2部分,下標小於目前的(左邊的),是排序好的序列####### ##########
    4.     for($i=1, $len=count($arr); $i< ;$len$i#++) {  

    5.         

      //取得目前需要比較的元素值。
    6.   

              

      $tmp
    7. # = 

      $arr# = ##1 [$i];          #///內層循環控制比較 並 插入  

      ###############        ####for######(#####$ ####=######$i######-1;######$j######>=0;######$j### ###--) {  #########
    8.    //$arr[$i];//需要插入的元素; $arr[$j];//需要比較的元素

    9. #            if($tmp## <##($tmp## #$arr[$j]) {  

    10. ####################### # ###//發現插入的元素較小,交換位置#####  #####################                ###//將後邊的元素元素與前面的元素互換######  #####################                ###$arr #$j######+1] = ######$arr#######[######$j#####];  ################################################################# #############                ###//將前一個的數字設定為 目前需要交換的數字#######o# ######                ###$arr######[######$j######] = ############$j######] =##################'> #######
    11.             } else {  

    12.                 //如果碰到不需要移动的元素  

    13.            //由于是已经排序好是数组,则前面的就不需要再次比较了。  

    14.                 break;  

    15.             }  

    16.         }  

    17.     }  

    18.     //将这个元素 插入到已经排序好的序列内。  

    19.     //返回  

    20.     return $arr;  

    21. }  

    <br/>

    六、希尔排序 

    介绍:

    希尔排序,也称递减增量排序算法,是插入排序的一种高速而稳定的改进版本。

    希尔排序是基于插入排序的以下两点性质而提出改进方法的:

    1、插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率

    2、但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位>

    排序效果:


    希尔排序其实可以理解是插入排序的一个优化版,它的效率跟增量有关,增量要取多少,根据不同的数组是不同的,所以希尔排序是一个不稳定的排序算法,它的时间复杂度为O(nlogn)到O(n^2)之间,实现代码如下:

    function shellSort($arr) {
        $len = count($arr);    $stepSize = floor($len / 2);    while ($stepSize >= 1) {        for ($i = $stepSize; $i < $len; $i++) {            if ($arr[$i] < $arr[$i - $stepSize]) {                $t = $arr[$i];                $j = $i - $stepSize;                while ($j >= 0 && $t < $arr[$j]) {                    $arr[$j + $stepSize] = $arr[$j];                    $j -= $stepSize;
                    }                $arr[$j + $stepSize] = $t;
                }
            }        // 缩小步长,再进行插入排序
            $stepSize = floor($stepSize / 2);
        }    return $arr;
    }$arr = [3,1,13,5,7,11,2,4,14,9,15,6,12,10,8];
    print_r(bubbleSort($arr));


    七、归并排序 

    介绍:

    归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(pide and Conquer)的一个非常典型的应用

    步骤:

    1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

    2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置

    3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

    4. 重复步骤3直到某一指针达到序列尾

    5. 将另一序列剩下的所有元素直接复制到合并序列尾

    排序效果:


    归并排序的时间复杂度也是O(nlogn)。原理是:对于两个排序好的数组,分别遍历这两个数组,获取较小的元素插入新的数组中,那么,这么新的数组也会是排序好的。代码如下:

    我们先来看看主函数部分:

    //交换函数function swap(array &$arr,$a,$b){
        $temp = $arr[$a];    $arr[$a] = $arr[$b];    $arr[$b] = $temp;
    }//归并算法总函数function MergeSort(array &$arr){
        $start = 0;    $end = count($arr) - 1;
        MSort($arr,$start,$end);
    }

    在总函数中,我们只调用了一个 MSort() 函数,因为我们要使用递归调用,所以将 MSort() 封装起来。

    下面我们来看看 MSort() 函数:

    function MSort(array &$arr,$start,$end){    //当子序列长度为1时,$start == $end,不用再分组    if($start < $end){        $mid = floor(($start + $end) / 2);	//将 $arr 平分为 $arr[$start - $mid] 和 $arr[$mid+1 - $end]        MSort($arr,$start,$mid);			//将 $arr[$start - $mid] 归并为有序的$arr[$start - $mid]        MSort($arr,$mid + 1,$end);			//将 $arr[$mid+1 - $end] 归并为有序的 $arr[$mid+1 - $end]        Merge($arr,$start,$mid,$end);       //将$arr[$start - $mid]部分和$arr[$mid+1 - $end]部分合并起来成为有序的$arr[$start - $end]
        }
    }

    上面的 MSort() 函数实现将数组分半再分半(直到子序列长度为1),然后将子序列合并起来。

    现在是我们的归并操作函数 Merge() :

    //归并操作function Merge(array &$arr,$start,$mid,$end){
        $i = $start;    $j=$mid + 1;    $k = $start;    $temparr = array();    while($i!=$mid+1 && $j!=$end+1)
        {       if($arr[$i] >= $arr[$j]){           $temparr[$k++] = $arr[$j++];
           }       else{           $temparr[$k++] = $arr[$i++];
           }
        }    //将第一个子序列的剩余部分添加到已经排好序的 $temparr 数组中
        while($i != $mid+1){        $temparr[$k++] = $arr[$i++];
        }    //将第二个子序列的剩余部分添加到已经排好序的 $temparr 数组中
        while($j != $end+1){        $temparr[$k++] = $arr[$j++];
        }    for($i=$start; $i<=$end; $i++){        $arr[$i] = $temparr[$i];
        }
    }

    到了这里,我们的归并算法就完了。我们调用试试:

    $arr = array(9,1,5,8,3,7,4,6,2);
    MergeSort($arr);
    var_dump($arr);

    相关推荐:

    php冒泡、选择、插入和快速排序算法分享

    PHP多维数组排序算法分析

    PHP排序算法系列之直接选择排序详解

    以上是php實作幾種常見的排序演算法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    如何防止會話固定攻擊?如何防止會話固定攻擊?Apr 28, 2025 am 12:25 AM

    防止會話固定攻擊的有效方法包括:1.在用戶登錄後重新生成會話ID;2.使用安全的會話ID生成算法;3.實施會話超時機制;4.使用HTTPS加密會話數據,這些措施能確保應用在面對會話固定攻擊時堅不可摧。

    您如何實施無會話身份驗證?您如何實施無會話身份驗證?Apr 28, 2025 am 12:24 AM

    實現無會話身份驗證可以通過使用JSONWebTokens(JWT)來實現,這是一種基於令牌的認證系統,所有的必要信息都存儲在令牌中,無需服務器端會話存儲。 1)使用JWT生成和驗證令牌,2)確保使用HTTPS防止令牌被截獲,3)在客戶端安全存儲令牌,4)在服務器端驗證令牌以防篡改,5)實現令牌撤銷機制,如使用短期訪問令牌和長期刷新令牌。

    PHP會議有哪些常見的安全風險?PHP會議有哪些常見的安全風險?Apr 28, 2025 am 12:24 AM

    PHP會話的安全風險主要包括會話劫持、會話固定、會話預測和會話中毒。 1.會話劫持可以通過使用HTTPS和保護cookie來防範。 2.會話固定可以通過在用戶登錄前重新生成會話ID來避免。 3.會話預測需要確保會話ID的隨機性和不可預測性。 4.會話中毒可以通過對會話數據進行驗證和過濾來預防。

    您如何銷毀PHP會議?您如何銷毀PHP會議?Apr 28, 2025 am 12:16 AM

    銷毀PHP會話需要先啟動會話,然後清除數據並銷毀會話文件。 1.使用session_start()啟動會話。 2.用session_unset()清除會話數據。 3.最後用session_destroy()銷毀會話文件,確保數據安全和資源釋放。

    如何更改PHP中的默認會話保存路徑?如何更改PHP中的默認會話保存路徑?Apr 28, 2025 am 12:12 AM

    如何改變PHP的默認會話保存路徑?可以通過以下步驟實現:在PHP腳本中使用session_save_path('/var/www/sessions');session_start();設置會話保存路徑。在php.ini文件中設置session.save_path="/var/www/sessions"來全局改變會話保存路徑。使用Memcached或Redis存儲會話數據,如ini_set('session.save_handler','memcached');ini_set(

    您如何修改PHP會話中存儲的數據?您如何修改PHP會話中存儲的數據?Apr 27, 2025 am 12:23 AM

    tomodifyDataNaphPsession,startTheSessionWithSession_start(),然後使用$ _sessionToset,修改,orremovevariables.1)startThesession.2)setthesession.2)使用$ _session.3)setormodifysessessvariables.3)emovervariableswithunset()

    舉一個在PHP會話中存儲數組的示例。舉一個在PHP會話中存儲數組的示例。Apr 27, 2025 am 12:20 AM

    在PHP會話中可以存儲數組。 1.啟動會話,使用session_start()。 2.創建數組並存儲在$_SESSION中。 3.通過$_SESSION檢索數組。 4.優化會話數據以提升性能。

    垃圾收集如何用於PHP會議?垃圾收集如何用於PHP會議?Apr 27, 2025 am 12:19 AM

    PHP會話垃圾回收通過概率機制觸發,清理過期會話數據。 1)配置文件中設置觸發概率和會話生命週期;2)可使用cron任務優化高負載應用;3)需平衡垃圾回收頻率與性能,避免數據丟失。

    See all articles

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    PhpStorm Mac 版本

    PhpStorm Mac 版本

    最新(2018.2.1 )專業的PHP整合開發工具

    VSCode Windows 64位元 下載

    VSCode Windows 64位元 下載

    微軟推出的免費、功能強大的一款IDE編輯器

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    MantisBT

    MantisBT

    Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具