php排名演算法,php排名統計圖

本文目錄一覽:

常見的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如何實現分數排名,判斷該學生第幾名,如圖

先根據票數倒序查詢票數表,sql語句大概是

“SELECT 學生id,票數 FROM 票數表 ORDER BY 票數 DESC”;假設得到的結果集賦值為 $res,

再用PHP遍歷,

$student = array();

foreach ($res as $key = $value) {

    $student[$value[‘學生id’]] = $key +1;

最後就可以得到student排名數組,鍵是學生的id,值就是學生的排名。

PHP中的快速排序演算法如何實現倒序?

您好,這樣的:

1. 冒泡排序法

* 思路分析:法如其名,就是像冒泡一樣,每次從數組當中 冒一個最大的數出來。

* 比如:2,4,1 // 第一次 冒出的泡是4

* 2,1,4 // 第二次 冒出的泡是 2

* 1,2,4 // 最後就變成這樣

view sourceprint?

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

02.function getpao($arr)

03.{

04.$len=count($arr);

05.//設置一個空數組 用來接收冒出來的泡

06.//該層循環控制 需要冒泡的輪數

07.for($i=1;$i$len;$i++)

08.{ //該層循環用來控制每輪 冒出一個數 需要比較的次數

09.for($k=0;$k$len-$i;$k++)

10.{

11.if($arr[$k]$arr[$k+1])

12.{

13.$tmp=$arr[$k+1];

14.$arr[$k+1]=$arr[$k];

15.$arr[$k]=$tmp;

16.}

17.}

18.}

19.return $arr;

20.}

2. 選擇排序法:

選擇排序法思路: 每次選擇一個相應的元素,然後將其放到指定的位置

view sourceprint?

01.function select_sort($arr) {

02.//實現思路 雙重循環完成,外層控制輪數,當前的最小值。內層 控制的比較次數

03.//$i 當前最小值的位置, 需要參與比較的元素

04.for($i=0, $len=count($arr); $i$len-1; $i++) {

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

06.$p = $i;

07.//$j 當前都需要和哪些元素比較,$i 後邊的。

08.for($j=$i+1; $j$len; $j++) {

09.//$arr[$p] 是 當前已知的最小值

10.if($arr[$p] $arr[$j]) {

11.//比較,發現更小的,記錄下最小值的位置;並且在下次比較時,

12.// 應該採用已知的最小值進行比較。

13.$p = $j;

14.}

15.}

16.//已經確定了當前的最小值的位置,保存到$p中。

17.//如果發現 最小值的位置與當前假設的位置$i不同,則位置互換即可

18.if($p != $i) {

19.$tmp = $arr[$p];

20.$arr[$p] = $arr[$i];

21.$arr[$i] = $tmp;

22.}

23.}

24.//返回最終結果

25.return $arr;

26.}

3.插入排序法

插入排序法思路:將要排序的元素插入到已經 假定排序號的數組的指定位置。

view sourceprint?

01.function insert_sort($arr) {

02.//區分 哪部分是已經排序好的

03.//哪部分是沒有排序的

04.//找到其中一個需要排序的元素

05.//這個元素 就是從第二個元素開始,到最後一個元素都是這個需要排序的元素

06.//利用循環就可以標誌出來

07.//i循環控制 每次需要插入的元素,一旦需要插入的元素控制好了,

08.//間接已經將數組分成了2部分,下標小於當前的(左邊的),是排序好的序列

09.for($i=1, $len=count($arr); $i$len; $i++) {

10.//獲得當前需要比較的元素值。

11.$tmp = $arr[$i];

12.//內層循環控制 比較 並 插入

13.for($j=$i-1;$j=0;$j–) {

14.//$arr[$i];//需要插入的元素; $arr[$j];//需要比較的元素

15.if($tmp $arr[$j]) {

16.//發現插入的元素要小,交換位置

17.//將後邊的元素與前面的元素互換

18.$arr[$j+1] = $arr[$j];

19.//將前面的數設置為 當前需要交換的數

20.$arr[$j] = $tmp;

21.} else {

22.//如果碰到不需要移動的元素

23.//由於是已經排序好是數組,則前面的就不需要再次比較了。

24.break;

25.}

26.}

27.}

28.//將這個元素 插入到已經排序好的序列內。

29.//返回

30.return $arr;

31.}

4.快速排序法

view sourceprint?

01.function quick_sort($arr) {

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

03.$length = count($arr);

04.if($length = 1) {

05.return $arr;

06.}

07.//如果沒有返回,說明數組內的元素個數 多餘1個,需要排序

08.//選擇一個標尺

09.//選擇第一個元素

10.$base_num = $arr[0];

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

12.//初始化兩個數組

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

14.$right_array = array();//大於標尺的

15.for($i=1; $i$length; $i++) {

16.if($base_num $arr[$i]) {

17.//放入左邊數組

18.$left_array[] = $arr[$i];

19.} else {

20.//放入右邊

21.$right_array[] = $arr[$i];

22.}

23.}

24.//再分別對 左邊 和 右邊的數組進行相同的排序處理方式

25.//遞歸調用這個函數,並記錄結果

26.$left_array = quick_sort($left_array);

27.$right_array = quick_sort($right_array);

28.//合併左邊 標尺 右邊

29.return array_merge($left_array, array($base_num), $right_array);

30.}

php幾種排序演算法實例詳解

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

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

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

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

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

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

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

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

PHP實現常見的排序演算法

註:為方便描述,下面的排序全為正序(從小到大排序)

假設有一個數組[a,b,c,d]

冒泡排序依次比較相鄰的兩個元素,如果前面的元素大於後面的元素,則兩元素交換位置;否則,位置不變。具體步驟:

1,比較a,b這兩個元素,如果ab,則交換位置,數組變為:[b,a,c,d]

2,比較a,c這兩個元素,如果ac,則位置不變,數組變為:[b,a,c,d]

3,比較c,d這兩個元素,如果cd,則交換位置,數組變為:[b,a,d,c]

完成第一輪比較後,可以發現最大的數c已經排(冒)在最後面了,接著再進行第二輪比較,但第二輪比較不必比較最後一個元素了,因為最後一個元素已經是最大的了。

第二輪比較結束後,第二大的數也會冒到倒數第二的位置。

依次類推,再進行第三輪,,,

就這樣最大的數一直往後排(冒),最後完成排序。所以我們稱這種排序演算法為冒泡排序。

選擇排序是一種直觀的演算法,每一輪會選出列中最小的值,把最小值排到前面。具體步驟如下:

插入排序步驟大致如下:

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

步驟:

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

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

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

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
FMECJ的頭像FMECJ
上一篇 2025-01-16 15:47
下一篇 2025-01-16 15:47

相關推薦

  • PHP和Python哪個好找工作?

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

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

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

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

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

    編程 2025-04-29
  • 如何製作疫情餅狀統計圖

    本文將從多個方面詳細闡述疫情餅狀統計圖的製作方法和注意事項。 一、選擇數據源 在製作疫情餅狀統計圖之前,需要先選擇數據源。最好選擇權威可靠的數據來源,比如世界衛生組織等組織發布的數…

    編程 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

發表回復

登錄後才能評論