php排序算法比較,排序算法的比較

本文目錄一覽:

php幾種排序算法實例詳解

下面給你介紹四種排序方法:

1) 插入排序(Insertion Sort)的基本思想是: 

每次將一個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子文件中的適當位置,直到全部記錄插入完成為止。實現代碼如下:

2) 選擇排序(Selection Sort)的基本思想是: 

每一趟從待排序的記錄中選出關鍵字最小的記錄,順序放在已排好序的子文件的最後,直到全部記錄排序完畢。實現代碼如下:

3) 冒泡排序的基本思想是: 

兩兩比較待排序記錄的關鍵字,發現兩個記錄的次序相反時即進行交換,直到沒有反序的記錄為止。實現代碼如下:

4) 快排也是一個高效的排序算法,它的時間複雜度也是O(nlogn)。原理是:選擇一個基準元素,然後把數組中小於這個元素的元素放在基準元素左邊,大於它的,放在基準元素右邊。然後對這兩邊繼續同樣的操作。代碼如下:

常見的php排序算法

常見的php排序算法

本文匯總了常見的php排序算法,在進行算法設計的時候有不錯的借鑒價值。現分享給大家供參考之用。具體如下:

一、插入排序

用文字簡單的描述,比如說$arr = array(4,2,4,6,3,6,1,7,9); 這樣的一組數字進行順序排序:

那麼,首先,拿數組的第二個元素和第一元素比較,假如第一個元素大於第二元素,那麼就讓兩者位置互換,接下來,拿數組的第三個元素,分別和第二個,第一個元素比較,假如第三個元素小,那麼就互換。依次類推。這就是插入排序,它的時間頻度是:1+2+…+(n-1)=(n^2)/2。則它的時間複雜度為O(n^2).

php實現代碼如下:

?phpfunction Sort($arr){ $count = count($arr); if($count2){ return $arr; } for($i=1;$i$count;$i++){ tmp=”$arr[$i];” j=””=0$arr[$j]$arr[$i]){ return=””

二、選擇排序

選擇排序用語言描述的話,可以這樣,如:$arr = array(4,3,5,2,1);

首先,拿第一個和後面所有的比,找出最小的那個數字,然後和第一個數組互換(當然,如果是第一個最小,那麼就不用互換了),接着循環,即:拿第二個和後面的比較,找出最小的數字,然後和第二個數字互換,依次類推,也就是說每次都是找出剩餘最小的值。 可得到:第一次,時間頻度 是n, (第一個和後面的n-1個比較,找到最小的,再看是不是第一個,不是第一個的話進行互換) 在往後,依次是 減一 。 它的時間複雜度,也是O(n^2);

php實現代碼如下:

?phpfunction selectSort($arr){ $count = count($arr); if($count2){ return $arr; } for($i=0;$i$count;$i++){ $min=$i; for(j=$i+1;$j$count;$j++){$arr[$j]){ $min = $j; //找到最小的那個元素的下標 } } if($min!=$i){//如果下標不是$i 則互換。 $tmp= $arr[$i]; $arr[$i] = $arr[$min]; $arr[$min] = $tmp; } } return $arr; }?

三、冒泡排序

冒泡排序其實上是和選擇排序相比,並無明顯差別。都是找到最小的,放到最左端。依次循環解決問題。差別在於冒泡排序的交換位置的次數較多,而選擇排序則是找到最小的元素的下標,然後直接和最左端的交換位置。

php實現代碼如下:

?phpfunction selectSort($arr){ $count = count($arr); if($count2){ return $arr; } for($i=0;$i$count;$i++){ for(j=$i+1;$j$count;$j++){$arr[$j]){ $tmp= $arr[$i]; $arr[$i] = $arr[$i]; $arr[$i] = $tmp; } } } return $arr; }?

四、快速排序

快速排序,用語言來形容的話,從數組中選擇一個值$a,然後和其餘元素進行比較,比$a大的放到數組right中,反之,放到數組left中。然後將left right 分別進行遞歸調用,即:再細分left right ,最後進行數組的合併。

php實現快速排序:

?phpfunction mySort($arr){ $count = count($arr); if($count2){ return $arr; } $key = $arr[0];//選擇第一個元素作為比較元素,可選其他 $left = array(); $right = array(); for($i=1;$i$count;$i++){ key=””=$arr[$i]){ $left[] = $arr[$i]; }else{ $right[] = $arr[$i]; } } $left = mySort($left); $right = mySort($right); $result = array_merge($left,$right); return $result; }?

五、歸併排序

其實歸併排序是一種拆分,合併的思想。和快速排序思想有共通之處,左邊一堆,右邊一堆,然後進行合併。通過遞歸實現排序。 區別之處呢? 他們的區別也是思想上本質的區別,快速排序的拆分,是選擇了特定的值進行大小比較,從而分為left 和 right 。也就是小的一堆放入left,大的一堆放入right。而後,小的left 再細分為left1 right1。。。。通過進行類似的遞歸完成排序。也就是說,一直細分下去,遞歸最末尾的left1就是最小值。

而歸併排序,是從幾何上的左右切分,一直遞歸切分成2或者1的’最小粒度的數組,然後才開始進行比較大小,然後合併。此處的比較大小是:兒子left的元素 和兒子的right元素 進行比較,而後進行排序合併成為父親left或者right。在此,直到拿到各自排序合併完成最後兩個數組:最起初的left 和right,也僅僅直到他們各自的順序,並不能確認整個數組的順序,還是需要通過最終的left right 比較後合併才能完成真正意義上的排序。

?phpfunction gbSort($arr){ if(count($arr)=1){return min=”floor(count($arr)/2);//取中間數字進行拆分” left=”gbSort($left);” right=”gbSort($right);” return=”” function=””$right[0] ? array_shift($right) : array_shift($left); //進行比較,小的移除,並且放入到數組$m中。 } return arr_merge($m,$left,$right);//進行合併(由於不知道left right 哪個會為空,所以進行統一合併)}?

六、堆排序

本例中fixDown函數實現對某一個節點的向下調整,這裡默認的是起始節點為1,方便計算父子節點關係

注:

起始節點為1的父子關係: 父節點k, 子節點為2K、2k+1 子節點j, 父節點為 floor(j/2) floor為向下取整

起始節點為0的父子關係: 父節點k, 子節點為2K+1, 2k+2 子節點j, 父節點為 floor((j-1)/2)

參數$k為調整點位置, $lenth為數組長度,也就是從1起始到最後一個節點的坐標.

?phpfunction fixDown($arr, $k, $lenth){while(2*$k=$lenth) { //只要當前節點有子節點, 就需要繼續該循環 $j = $k*2; if ($j$lenth $arr[$j]$arr[$j+1]) $j++; // 只要子節點有右節點,且右節點比左節點大,那麼切換到右節點操作。 if ($arr[$j] $arr[$k]) break; // 如果子節點都沒有父節點大, 那麼調整結束。 exch($arr[$j], $arr[$k]); $k = $j; }}function exch($a, $b) { $tmp = $a; $a = $b; $b = $tmp;}function headSort($arr){ $len = count($arr); array_unshift($arr, NULL); for($i=$len/2;$i=1;$i–) { fixDown($arr, $i, $len); } while($len1) { exch($arr[1], $arr[$len]); fixDown($arr, 1, –$len); } array_shift($arr);}$arr = array(4,6,4,9,2,3);headSort($arr);?

希望本文所述排序算法實例對大家的php程序設計有所幫助。

;

求助php:strnatcmp()函數是按照自然排序進行比較的

//該函數實現了以人類習慣對數字型字符串進行排序的比較算法,這就是「自然順序」。注意//該比較區分大小寫。  

//下面的例子展示了該算法與計算機常規字符串比較算法( strcmp() 所使用的)的區別:

?php

$arr1 = $arr2 = array(“img12.png”, “img10.png”, “img2.png”, “img1.png”);

echo “Standard string comparison\n”;

usort($arr1, “strcmp”);

print_r($arr1);

echo “\nNatural order string comparison\n”;

usort($arr2, “strnatcmp”);

print_r($arr2);

//以上例程會輸出:

Standard string comparison

Array

(

    [0] = img1.png

    [1] = img10.png

    [2] = img12.png

    [3] = img2.png

)

Natural order string comparison

Array

(

    [0] = img1.png

    [1] = img2.png

    [2] = img10.png

    [3] = img12.png

)

明白了嗎?自然排序,就是平時數數的那個。

ascil碼也是abc··的順序,有大小寫問題。我覺得他們的差別不在於字母,而是數字。字母就相當字符串那樣比的

PHP快速排序算法實現的原理及代碼詳解

算法原理

下列動圖來自五分鐘學算法,演示了快速排序算法的原理和步驟。

步驟:

從數組中選個基準值

將數組中大於基準值的放同一邊、小於基準值的放另一邊,基準值位於中間位置

遞歸的對分列兩邊的數組再排序

代碼實現

function

quickSort($arr)

{

$len

=

count($arr);

if

($len

=

1)

{

return

$arr;

}

$v

=

$arr[0];

$low

=

$up

=

array();

for

($i

=

1;

$i

$len;

++$i)

{

if

($arr[$i]

$v)

{

$up[]

=

$arr[$i];

}

else

{

$low[]

=

$arr[$i];

}

}

$low

=

quickSort($low);

$up

=

quickSort($up);

return

array_merge($low,

array($v),

$up);

}

測試代碼:

$startTime

=

microtime(1);

$arr

=

range(1,

10);

shuffle($arr);

echo

“before

sort:

“,

implode(‘,

‘,

$arr),

“\n”;

$sortArr

=

quickSort($arr);

echo

“after

sort:

“,

implode(‘,

‘,

$sortArr),

“\n”;

echo

“use

time:

“,

microtime(1)

$startTime,

“s\n”;

測試結果:

before

sort:

1,

7,

10,

9,

6,

3,

2,

5,

4,

8

after

sort:

1,

2,

3,

4,

5,

6,

7,

8,

9,

10

use

time:

0.0009009838104248s

時間複雜度

快速排序的時間複雜度在最壞情況下是O(N2),平均的時間複雜度是O(N*lgN)。

這句話很好理解:假設被排序的數列中有N個數。遍歷一次的時間複雜度是O(N),需要遍歷多少次呢?至少lg(N+1)次,最多N次。

1)

為什麼最少是lg(N+1)次?快速排序是採用的分治法進行遍歷的,我們將它看作一棵二叉樹,它需要遍歷的次數就是二叉樹的深度,而根據完全二叉樹的定義,它的深度至少是lg(N+1)。因此,快速排序的遍歷次數最少是lg(N+1)次。

2)

為什麼最多是N次?這個應該非常簡單,還是將快速排序看作一棵二叉樹,它的深度最大是N。因此,快讀排序的遍歷次數最多是N次。

您可能感興趣的文章:PHP快速排序算法實例分析PHP四種排序算法實現及效率分析【冒泡排序,插入排序,選擇排序和快速排序】PHP排序算法之快速排序(Quick

Sort)及其優化算法詳解PHP遞歸實現快速排序的方法示例php

二維數組快速排序算法的實現代碼PHP常用排序算法實例小結【基本排序,冒泡排序,快速排序,插入排序】PHP快速排序quicksort實例詳解

關於PHP冒泡排序法。

前台輸入部分我就不寫了,管你是用字符串形式一起傳到後台還是說先用js存儲了再提交到後台,總之假設你前天都獲得了一個一維數組,這裡給一個從大到小,一個從小到大的寫法:

從大到小:

?php

/**

* 冒泡排序算法示例

*/

// 這裡以一維數組做演示

$demo_array = array(23,15,43,25,54,2,6,82,11,5,21,32,65);

// 第一層for循環可以理解為從數組中鍵為0開始循環到最後一個

for ($i=0;$icount($demo_array);$i++) {

// 第二層將從鍵為$i的地方循環到數組最後

for ($j=$i+1;$jcount($demo_array);$j++) {

// 比較數組中相鄰兩個值的大小

if ($demo_array[$i] $demo_array[$j]) {

$tmp            = $demo_array[$i]; // 這裡的tmp是臨時變量

$demo_array[$i] = $demo_array[$j]; // 第一次更換位置

$demo_array[$j] = $tmp;            // 完成位置互換

}

}

}

// 打印結果集

echo ‘pre’;

var_dump($demo_array);

echo ‘/pre’;

從小到大:

?php

/**

* 冒泡排序算法示例

*/

// 這裡以一維數組做演示

$demo_array = array(23,15,43,25,54,2,6,82,11,5,21,32,65);

// 第一層for循環可以理解為從數組中鍵為0開始循環到最後一個

for ($i=0;$icount($demo_array);$i++) {

// 第二層將從鍵為$i的地方循環到數組最後

for ($j=$i+1;$jcount($demo_array);$j++) {

// 比較數組中相鄰兩個值的大小

if ($demo_array[$i] $demo_array[$j]) {

$tmp            = $demo_array[$i]; // 這裡的tmp是臨時變量

$demo_array[$i] = $demo_array[$j]; // 第一次更換位置

$demo_array[$j] = $tmp;            // 完成位置互換

}

}

}

// 打印結果集

echo ‘pre’;

var_dump($demo_array);

echo ‘/pre’;

主要的代碼已經給你寫出來了,你自己把前端部分加上就行了

原創文章,作者:TDVY,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/149628.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
TDVY的頭像TDVY
上一篇 2024-11-05 16:53
下一篇 2024-11-05 16:53

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python實現爬樓梯算法

    本文介紹使用Python實現爬樓梯算法,該算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • Harris角點檢測算法原理與實現

    本文將從多個方面對Harris角點檢測算法進行詳細的闡述,包括算法原理、實現步驟、代碼實現等。 一、Harris角點檢測算法原理 Harris角點檢測算法是一種經典的計算機視覺算法…

    編程 2025-04-29
  • 數據結構與算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序算法、字符串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • 瘦臉算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉算法 Python 實現的原理和方法,包括該算法的意義、流程、代碼實現、優化等內容。 一、算法意義 隨着科技的發展,瘦臉算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • 神經網絡BP算法原理

    本文將從多個方面對神經網絡BP算法原理進行詳細闡述,並給出完整的代碼示例。 一、BP算法簡介 BP算法是一種常用的神經網絡訓練算法,其全稱為反向傳播算法。BP算法的基本思想是通過正…

    編程 2025-04-29
  • 粒子群算法Python的介紹和實現

    本文將介紹粒子群算法的原理和Python實現方法,將從以下幾個方面進行詳細闡述。 一、粒子群算法的原理 粒子群算法(Particle Swarm Optimization, PSO…

    編程 2025-04-29

發表回復

登錄後才能評論