1. 程式人生 > >PHP四種基礎演算法詳解

PHP四種基礎演算法詳解

許多人都說 演算法是程式的核心,一個程式的好於差,關鍵是這個程式演算法的優劣。作為一個初級phper,雖然很少接觸到演算法方面的東西 。但是對於氣泡排序,插入排序,選擇排序,快速排序四種基本演算法,我想還是要掌握的。

需求:分別用 氣泡排序法,快速排序法,選擇排序法,插入排序法將下面陣列中 的值按照從小到的順序進行排序。

  1. $arr=array(11,3,56,62,21,66,32,78,36,76,39,88,34);

1.氣泡排序

介紹:

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

步驟:

  1. 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
  2. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
  3. 針對所有的元素重複以上的步驟,除了最後一個。
  4. 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

具體程式碼:

  1. 複製程式碼
     1 $arr=array(1,43,54,62,21,66,32,78,36,76,39);
     2 function bubbleSort ($arr)
     3 {
     4 $len = count($arr);
     5 //該層迴圈控制 需要冒泡的輪數
     6 for ($i=1; $i<$len; $i
    ++) { 7 //該層迴圈用來控制每輪 冒出一個數 需要比較的次數 8 for ($k=0; $k<$len-$i; $k++) { 9 if($arr[$k] > $arr[$k+1]) { 10 $tmp = $arr[$k+1]; // 宣告一個臨時變數 11 $arr[$k+1] = $arr[$k]; 12 $arr[$k] = $tmp; 13 } 14 } 15 } 16 return $arr; 17 }
    複製程式碼

排序效果:

2.選擇排序

介紹:

選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小元素,然後放到排序序列末尾。以此類推,直到所有元素均排序完畢。

具體程式碼:

  1. 複製程式碼
     1 //實現思路 雙重迴圈完成,外層控制輪數,當前的最小值。內層 控制的比較次數
     2 function select_sort($arr) {
     3 //$i 當前最小值的位置, 需要參與比較的元素
     4 for($i=0, $len=count($arr); $i<$len-1; $i++) {
     5 //先假設最小的值的位置
     6 $p = $i;
     7 //$j 當前都需要和哪些元素比較,$i 後邊的。
     8 for($j=$i+1; $j<$len; $j++) {
     9 //$arr[$p] 是 當前已知的最小值
    10 if($arr[$p] > $arr[$j]) {
    11 //比較,發現更小的,記錄下最小值的位置;並且在下次比較時,應該採用已知的最小值進行比較。
    12 $p = $j;
    13 }
    14 }
    15 //已經確定了當前的最小值的位置,儲存到$p中。
    16 //如果發現 最小值的位置與當前假設的位置$i不同,則位置互換即可
    17 if($p != $i) {
    18 $tmp = $arr[$p];
    19 $arr[$p] = $arr[$i];
    20 $arr[$i] = $tmp;
    21 }
    22 }
    23 //返回最終結果
    24 return $arr;
    25 }
    複製程式碼

排序效果:

3.插入排序

介紹:

插入排序(Insertion Sort)的演算法描述是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,通常採用in-place排序(即只需用到O(1)的額外空間的排序),因而在從後向前掃描過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。

步驟:

  1. 從第一個元素開始,該元素可以認為已經被排序
  2. 取出下一個元素,在已經排序的元素序列中從後向前掃描
  3. 如果該元素(已排序)大於新元素,將該元素移到下一位置
  4. 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置
  5. 將新元素插入到該位置中
  6. 重複步驟2

具體程式碼:

  1. 複製程式碼
     1 function insert_sort($arr)
     2 {
     3 $len=count($arr);
     4 for($i=1; $i<$len; $i++) {
     5 //獲得當前需要比較的元素值。
     6 $tmp = $arr[$i];
     7 //內層迴圈控制 比較 並 插入
     8 for($j=$i-1; $j>=0; $j--) {
     9 //$arr[$i];//需要插入的元素; $arr[$j];//需要比較的元素
    10 if($tmp < $arr[$j]) {
    11 //發現插入的元素要小,交換位置
    12 //將後邊的元素與前面的元素互換
    13 $arr[$j+1] = $arr[$j];
    14 //將前面的數設定為 當前需要交換的數
    15 $arr[$j] = $tmp;
    16 } else {
    17 //如果碰到不需要移動的元素
    18 //由於是已經排序好是陣列,則前面的就不需要再次比較了。
    19 break;
    20 }
    21 }
    22 }
    23 //將這個元素 插入到已經排序好的序列內。
    24 //返回
    25 return $arr;
    26 }
    複製程式碼

排序效果:

4.快速排序

介紹:

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

步驟:

  1. 從數列中挑出一個元素,稱為 “基準”(pivot),
  2. 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。
  3. 遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。

具體程式碼:

  1. 複製程式碼
     1 function quick_sort($arr)
     2 {
     3 //判斷引數是否是一個數組
     4 if(!is_array($arr)) return false;
     5 //遞迴出口:陣列長度為1,直接返回陣列
     6 $length = count($arr);
     7 if($length<=1) return $arr;
     8 //陣列元素有多個,則定義兩個空陣列
     9 $left = $right = array();
    10 //使用for迴圈進行遍歷,把第一個元素當做比較的物件
    11 for($i=1; $i<$length; $i++)
    12 {
    13 //判斷當前元素的大小
    14 if($arr[$i]<$arr[0]){
    15 $left[]=$arr[$i];
    16 }else{
    17 $right[]=$arr[$i];
    18 }
    19 }
    20 //遞迴呼叫
    21 $left=quick_sort($left);
    22 $right=quick_sort($right);
    23 //將所有的結果合併
    24 return array_merge($left,array($arr[0]),$right);
    25 }
    複製程式碼

排序效果:

本文轉載自

isykw

原文地址:http://www.cnblogs.com/isykw/p/6115461.html

相關推薦

PHP基礎演算法

許多人都說 演算法是程式的核心,一個程式的好於差,關鍵是這個程式演算法的優劣。作為一個初級phper,雖然很少接觸到演算法方面的東西 。但是對於氣泡排序,插入排序,選擇排序,快速排序四種基本演算法,我想還是要掌握的。 需求:分別用 氣泡排序法,快速排序法,選擇排序法,插入排序法將下面陣列中 的值按照從小

php基礎演算法:冒泡,選擇,插入和快速排序法 程式碼練習

function maopao($arr,$len) { for($i=1;$i<$len;$i++) { for($j=0;$j<$len-$i;$j++) { if($arr[$j]>$arr[$j+1])

php 基礎演算法集合

// 排序演算法學習 // 1:氣泡排序 // 思路分析:在要排序的一組數中,對當前還未排好的序列,從前往後對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即,每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。 // //程式碼實現: $

php基礎演算法

function quick_sort($arr) { //先判斷是否需要繼續進行 $length = count($arr); if($length <= 1) { return $arr; } //如果沒有返回,說明陣列內的元素個數 多餘1個,需要排序 //選擇一個標尺 //選擇第一個元素 $ba

PHP 基礎演算法

氣泡排序 思路:​每次迴圈排列出一個最大的數 選擇排序 ​思路:每一趟在n-i+1(i = 1,2,…,n-1)個記錄中選擇關鍵字最小的記錄作為有序序列中第i個記錄,其中最簡單的是簡單選擇排序

php基礎演算法程式碼例項

php四種基礎演算法:冒泡,選擇,插入和快速排序法 許多人都說 演算法是程式的核心,一個程式的好於差,關鍵是這個程式演算法的優劣。作為一個初級phper,雖然很少接觸到演算法方面的東西 。但是對於氣泡排序,插入排序,選擇排序,快速排序四種基本演算法,我想還是要掌握的。下面是

php基礎排序(基礎演算法)----①氣泡排序法

氣泡排序法: 顧名思義,如冒泡泡一樣,每次將陣列中最大的數冒出來  舉例:     2,3,1.    第一次先將3冒出來,變成-------->  2,1,3    第二次再講2冒出來,變成--

Activity的載入模式(standard singleTop singleTask singleInstance)

最簡單的理解 activity的四種載入模式 在android的多activity開發中,activity之間的跳轉可能需要有多種方式,有時是普通的生成一個新例項,有時希望跳轉到原來某個activity例項,而不是生成大量的重複的activity。載入模式便是決定以哪種方式啟動一個

Java基礎演算法

查詢和排序演算法是演算法的入門知識,其經典思想可以用於很多演算法當中。因為其實現程式碼較短,應用較常見。所以在面試中經常會問到排序演算法及其相關的問題。但萬變不離其宗,只要熟悉了思想,靈活運用也不是難事。一般在面試中最常考的是快速排序和歸併排序,並且經常有面試官要求現場寫出這兩種排序的程式碼。對這兩

android開發引用的

簡述: 在android開發中,開發到一定程度的之後,就會開始關注關於APP的各種效能優化,其中很重要的一個點,就是關於四種引用的合理引用,另外在android的各種面試中,也會經常被問到關於四種引用的各種問題。 哪四種引用 四種引用分別為:  1. 強引用(Stron

JAVA中this的用法的

2018年10月31日 15:27:47 Nirvana again 閱讀數:2 個人分類: JAVA

php 二分查詢法演算法

一、概念:二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;

java內部類

一般來說,有4中內部類:常規內部類、靜態內部類、區域性內部類、匿名內部類。  一.常規內部類:常規內部類沒有用static修飾且定義在在外部類類體中。   1.常規內部類中的方法可以直接使用外部類的例項變數和例項方法。   2.在常規內部類中可以直接用內部類建立物件  

12排序演算法

作者:寒小陽 0、前言      從這一部分開始直接切入我們計算機網際網路筆試面試中的重頭戲演算法了,初始的想法是找一條主線,比如資料結構或者解題思路方法,將博主見過做過整理過的演算法題逐個分析一遍(博主當年自己學演算法就是用這種比較笨的刷題學的,

【REACT NATIVE 系列教程之一】觸控事件的兩形式與TOUCHABLE元件

本文是RN(React Native)系列教程第一篇,當然也要給自己的群做個廣告:  React Native @Himi :126100395  剛建立的群,歡迎一起學習、討論、進步。本文主要講解兩點:1.   PanResponder:觸控事件,用以獲取使用者手指所在螢幕的座標(x,y)或觸發、或滑動、或

PHP實現各種經典演算法

<? //-------------------- // 基本資料結構演算法 //-------------------- //二分查詢(數組裡查詢某個元素) function bin_sch($array, $low, $high, $k){

C++ 幾排序演算法

排序的演算法有很多種,其關鍵在於根據待排序序列的特性選擇合適的排序方式。下面將介紹不同的排序方式。 基本排序演算法 基本排序演算法主要包括插入排序,快速排序,氣泡排序等三種排序方式,下面將對這三種排序演算法分別進行分析 插入排序 假定待排序陣列序列為:data[5,2

PHP基礎排序算法的運行時間比較

enter lec image count 圖片 return rand span pan <?php /** * php四種基礎排序算法的運行時間比較 */ //冒泡排序法 function bubbleSort($array){   $temp =

JVM——垃圾收集演算法

之前幾篇部落格介紹了記憶體模型以及判斷物件是否存活的兩種演算法,當一個物件死亡的時候,就要被當做垃圾回收。那麼今天我們就來了解一下垃圾收集演算法,看看都是怎麼將這些死亡的物件給回收了去。 目前主要的垃圾收集演算法有四種,分別是標記-清除演算法、複製演算法、標記整理演算法以及分代收集演算法。下面我

LVS工作模式及排程演算法

LVS即Linux虛擬伺服器       LVS實現了基於IP的資料請求負載均衡排程方案,它實現了四層交換,終端網際網路使用者從外部訪問公司的外部負載均衡伺服器,終端使用者的Web請求會發送給LVS排程器,LVS根據自身的排程演算法將客戶端請求