1. 程式人生 > >php實現的幾種基本演算法

php實現的幾種基本演算法

一直以來,演算法在我的認知裡都很神奇。因為它們總在不經意之間就改變了世界。我們也是後來的得益者,站在巨人的肩膀上,才能看的更遠。感謝那些不曾認識的甲乙丙。

建議去看見下我的另一篇文章,關於時間複雜度的介紹,連結,有助於大家科學的瞭解演算法的優劣

氣泡排序

/*
 *  氣泡排序 (效率比較低)
 *
 *  外層迴圈決定迴圈層數
 *  內層,兩兩比較,交換位置
 *  每層迴圈過後,後面的值總是有序的最大(最小)的值,下次就無需去比較他們。
 *  加入變數flag,如果沒有交換位置,則說明順序是對的,可以跳出迴圈結束了
 */
    $arr = array();
    $arr = array(1,98,5,34,23,87,54,23,12,0,456,123,45);
    $len = count($arr);

    for($i=1;$i<$len;$i++){
        $flag = true;
        for($j=0;$j<$len-$i;$j++){
            if($arr[$j]>$arr[$j+1]){
                $flag = false;
                $temp = $arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j+1] =$temp;
            }
        }
        if($flag){
            break;
        }

    }

    print_r($arr);

選擇排序

/*
 * 選擇排序 (比冒泡效率高)
 *   
 *   外層決定迴圈層數
 *   選擇排序就是預設當前值為最小值,記錄下標,然後進行迴圈比較,記錄最小(最大)值的下標,最後交換兩者的值。這樣第一個值就是最小(最大)值。
 *   然後,依次,迴圈下去。最後得到的就是有序的陣列
 */



    $arr = array();
    $arr = array(1,98,5,34,23,87,54,23,12,0,456,123,45);
    $len = count($arr);
    for($i=0;$i<$len-1;$i++){
        $p = $i;  //預設當前位置的值即為最小,記錄下下標。 
        for($j=$p+1;$j<$len;$j++){
            if($arr[$p]>$arr[$j]){
                $p = $j;         //如果當前值比預設值小。則記錄其下標
            }
        }   
        if($p !=$i){
            $temp = $arr[$p];
            $arr[$p] = $arr[$i];
            $arr[$i] = $temp;
        }
    }

    print_r($arr);

插入排序(效率也比冒泡快)

這裡寫圖片描述

/*
 * 插入排序
 *   
 *   外層決定迴圈層數,把當前值作為插入值去和前面的值進行比較
 *   前面的值總是有序的,插入的值只需要和前面的值進行比較,確定最終位置就可以了
 *   迴圈排序就好了
 */

    $arr = array();
    $arr = array(1,98,5,34,23,87,54,23,12,0,456,123,45);
    $len = count($arr);
    for($i=1;$i<$len;$i++){
        $temp = $arr[$i];
        for($j=$i-1;$i>=0;$j--){
            if($arr[$j]>$temp){
                $arr[$j+1] = $arr[$j];
                $arr[$j] = $temp;
            }else{
                break;
            }
        }

    }

    print_r($arr);

快速排序 (20世紀十大排序方法之一)

/*
 * 快速排序
 *   
 * 首先選取一個值,作為標尺,把大於他的放到right_array中,小於他的放到left_array中,遞迴呼叫
 * 直到陣列數為1,則返回,最後合併起來就是結果
 */
function quick_sort($arr) {  
    //先判斷是否需要繼續進行  
    $length = count($arr);  
    if($length <= 1) {  
        return $arr;  
    }  
    //如果沒有返回,說明陣列內的元素個數 多餘1個,需要排序  
    //選擇一個標尺  
    //選擇第一個元素  
    $base_num = $arr[0];  
    //遍歷 除了標尺外的所有元素,按照大小關係放入兩個陣列內  
    //初始化兩個陣列  
    $left_array = array();//小於標尺的  
    $right_array = array();//大於標尺的  
    for($i=1; $i<$length; $i++) {  
        if($base_num > $arr[$i]) {  
            //放入左邊陣列  
            $left_array[] = $arr[$i];  
        } else {  
            //放入右邊  
            $right_array[] = $arr[$i];  
        }  
    }  
    //再分別對 左邊 和 右邊的陣列進行相同的排序處理方式  
    //遞迴呼叫這個函式,並記錄結果  
    $left_array = quick_sort($left_array); 
    $right_array = quick_sort($right_array);  
    //合併左邊 標尺 右邊  
    return array_merge($left_array, array($base_num), $right_array); 
}
$arr = array(1,98,5,34,23,87,54,23,12,0,456,123,45);
$res = quick_sort($arr);  
print_r($res);die;

千里之行,始於足下。加油!

相關推薦

php實現基本演算法

一直以來,演算法在我的認知裡都很神奇。因為它們總在不經意之間就改變了世界。我們也是後來的得益者,站在巨人的肩膀上,才能看的更遠。感謝那些不曾認識的甲乙丙。 建議去看見下我的另一篇文章,關於時間複雜度

php實現常見的排序演算法

一、氣泡排序 氣泡排序理解起來是最簡單,但是時間複雜度(O(n^2))也是最大的之一,實現程式碼如下: function bubbleSort($arr) { $len = count(

php實現排序演算法

<?php /** * Created by PhpStorm. * User: frowhy * Date: 2017/4/4 * Time: 04:14 * *_______________%%%%%%%%%_____________________

模式識別的基本演算法

           本學期選了模式識別的課程,該期末考試了, 將本課程的幾種基本演算法整理一下。 0.最小距離分類判別演算法 (1)定義:是指求出未知類別向量到要識別各類別代表向量中心點的距離,將未知類別向量歸屬於距離最小一類的一種影象分類方法。 (2)用Matlab實現

學習筆記---PHP加密演算法(MD5,shal,base64_encode等)

PHP中有多種加密演算法。 1.md5()—–不可逆,無解密演算法 md5(string $str[,bool $raw_output = false|true]); 引數: $str:待加密的字串 $raw_output:可選引數為true或

Python實現簡單的排序演算法

一.氣泡排序 概念:為一個無序的列表排成有序的 實現過程描述:(升序)   1.比較相鄰的元素,如果第一個比第二個大,就交換他們的位置   2.對每一對相鄰元素重複1的工作,從開始第一隊到最後一對,最後結束的時候最大的數會在後面   3.針對所有元素重複1,2的工作,除了最後一個數,因為最後的數最大

總結排序演算法的Java實現

1、氣泡排序 氣泡排序是一種交換排序,它的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。 Java程式碼: import java.util.Random; public class BubbleSort { /** * 改進的氣

Python Numpy 100題實驗(九):標準化演算法實現

單獨把這幾道題目拿出來,歸為一類吧,都是標準化演算法。 本講的主要內容: Z-Score標準化演算法 Min-Max標準化演算法 應用L2正規化標準化資料 使用Z-Score標準化演算法對資料進行標準化處理 首先給出Z-Score標準化公式: Z=X−mea

基本的排序演算法總結

準備函式 var arr = [] function swap(arr, a, b) { //交換函式 var temp = arr[a] arr[a] = arr[b] arr[b] = temp } function random_ar

常見演算法的Python實現

1、選擇排序 選擇排序是一種簡單直觀的排序演算法。它的原理是這樣:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的後面,以此類推,直到所有元素均排序完畢。演算法實現如下: #找到最小的元素 def Fin

排序演算法java實現

沒有配圖,過幾天補上 package com.sort; public class Sort { /** * 插入排序 * 原理:往有序的子陣列選擇一個合適的位置插進去 * */ public void insertSort(int sort[

壓縮演算法實現原理詳解

gzip 、zlib以及圖形格式png,使用的壓縮演算法都是deflate演算法。從gzip的原始碼中,我們瞭解到了defalte演算法的原理和實現。我閱讀的gzip版本為 gzip-1.2.4。下面我們將要對deflate演算法做一個分析和說明。首先簡單介紹一下基本原理,

排序演算法實現以及穩定性

穩定性演算法:氣泡排序、插入排序、歸併排序、基數排序 不穩定性演算法:選擇排序、快速排序、堆排序、希爾排序、桶排序 /**  *   * @author huangsen  * 插入排序:一個有序陣列,一個無序陣列,將無序陣列插入到有序陣列中  *  */ public

nginx實現http負載均衡的排程演算法具體補充

首先知道一點: upstream 支援的狀態引數 在HTTP Upstream模組中,可以通過server指令指定後端伺服器的IP地址和埠,同時還可以設定每個後端伺服器在負載均衡排程中的狀態。

php常用演算法

寫一下幾種常見排序演算法,清一下腦子 歸併排序 /** * Created by PhpStorm. * User: leon * Date: 2018/3/14 * Time: 下午2:37 */ function mergeSort(&am

隨機生成100個數,利用排序演算法對其實現排序(C++)

#include<iostream> #include<cstdlib> #include<ctime> using namespace std; //交換 template<class T> void Swap(T &a,T &b) {

排序演算法實現分析

合併排序 void merge(int a[],int left,int mid,int right,int b[]) { int i = left; int j = mid +1; int k = left; while(i&

基本排序算法總結

子序列 system aop 大於等於 != pri i++ index 元素移動 以下均采用從小到大排序: 1.選擇排序算法 個人覺得選擇排序算法是容易理解的排序算法,即從n個元素中選擇最小的一個元素與第一個元素交換,再將除第一個元素之外的n-1個元素找到最小的一

基本的數字正則表達式[轉]

包含 沒有 美國 100% 小數 小靈通 表達式 擴展名 aid 只能輸入1個數字 表達式 ^\d$ 描述 匹配一個數字 匹配的例子 0,1,2,3 不匹配的例子 只能輸入n個數字 表達式 ^\d{n}$ 例如^\d{8}$ 描述 匹配8個

字符串截取的基本方法

字符串截取 clas mov logs reg -a expr body regex 分享幾個經常用到的字符串的截取 string str="123abc456";int i=3;1 取字符串的前i個字符 str=str.Substring(0,i); //