成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP算法之四大基礎(chǔ)算法

isLishude / 2350人閱讀

摘要:而在證明算法是正確的基礎(chǔ)上,第二步就是分析算法的時(shí)間復(fù)雜度。算法的時(shí)間復(fù)雜度反映了程序執(zhí)行時(shí)間隨輸入規(guī)模增長而增長的量級(jí),在很大程度上能很好反映出算法的優(yōu)劣與否。

前言

雖然工作中,你覺得自己并沒有涉及到算法這方面的東西,但是算法是程序的核心,一個(gè)程序的好與差,關(guān)鍵是這個(gè)程序算法的優(yōu)劣,所以對(duì)于冒泡排序、插入排序、選擇排序、快速排序這四種基本算法,我想還是要掌握的。

冒泡排序法
冒泡排序大概的意思是依次比較相鄰的兩個(gè)數(shù),然后根據(jù)大小做出排序,直至最后兩位數(shù)。由于在排序過程中總是小數(shù)往前放,大數(shù)往后放,相當(dāng)于氣泡往上升,所以稱作冒泡排序。

冒泡是從前往后冒,所以,每輪比較的次數(shù)也是逐漸減少的,最后一個(gè)數(shù)不用比較,其時(shí)間復(fù)雜度為O(n2),算法如下:

/**
 * 冒泡排序算法
 * @param array $arr
 * @return array
 */
function bubble_sort($arr) {
    // 判斷參數(shù)是否為數(shù)組,且不為空
    if (!is_array($arr) || empty($arr)) {
        return $arr;
    }
    // 循環(huán)需要冒泡的輪數(shù)
    for ($i = 1, $len = count($arr); $i < $len; $i++) {
        // 循環(huán)每輪需要比較的次數(shù)
        for ($j = 0; $j < $len - $i; $j++) {
            // 大的數(shù),交換位置,往后挪
            if ($arr[$j] > $arr[$j + 1]) {
                $temp = $arr[$j + 1];
                $arr[$j + 1] = $arr[$j];
                $arr[$j] = $temp;
            }
        }
    }
    return $arr;
}
選擇排序法
選擇排序的原理:首先在未排序序列中找到最?。ù螅┰?,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續(xù)尋找最?。ù螅┰兀缓蠓诺揭雅判蛐蛄械哪┪?;以此類推,直到所有元素均排序完畢。

選擇是每一次從假定一個(gè)最小值的位置,然后用假定最小值和后面的值依次比較,找到實(shí)際的最小值來放到假定最小值的位置上,其時(shí)間復(fù)雜度也為O(n2),算法如下:

/**
 * 選擇排序法
 * @param array $arr
 * @return array
 */
function select_sort($arr) {
    // 判斷參數(shù)是否為數(shù)組,且不為空
    if (!is_array($arr) || empty($arr)) {
        return $arr;
    }
    $len = count($arr);
    for ($i = 0; $i < $len - 1; $i++) {
        // 假設(shè)最小數(shù)的位置
        $min = $i;
        // 用假設(shè)的最小數(shù)和$i后面的數(shù)循環(huán)比較,找到實(shí)際的最小數(shù)
        for ($j = $i + 1; $j < $len; $j++) {
            // 后面的數(shù)比假設(shè)的最小數(shù)小,替換最小數(shù)
            if ($arr[$min] > $arr[$j]) {
                $min = $j;
            }
        }
        // 假設(shè)的最小數(shù)和實(shí)際不符,交換位置
        if ($min != $i) {
            $temp = $arr[$min];
            $arr[$min] = $arr[$i];
            $arr[$i] = $temp;
        }
    }
    return $arr;
}
插入排序法
插入排序的原理:每次將一個(gè)待排序的記錄,按其關(guān)鍵字大小插入到前面已經(jīng)排好序的子序列中的適當(dāng)位置,直到全部記錄插入完成為止。

插入排序法是先將排序元素的前兩個(gè)元素排序,然后將第三個(gè)元素插入已經(jīng)排序好的兩個(gè)元素中,所以這三個(gè)元素仍然是從小到大排序,接著將第四個(gè)元素插入,重復(fù)操作直到所有元素都排序好;其時(shí)間復(fù)雜度同樣為O(n2),算法如下:

/**
 * 插入排序法
 * @param array $arr
 * @return array
 */
function insert_sort($arr) {
    // 判斷參數(shù)是否為數(shù)組,且不為空
    if (!is_array($arr) || empty($arr)) {
        return $arr;
    }
    $len = count($arr);
    for ($i = 1; $i < $len; $i++) {
        // 當(dāng)前需要比較的臨時(shí)數(shù)
        $tmp = $arr[$i];
        // 循環(huán)比較臨時(shí)數(shù)所在位置前面的數(shù)
        for ($j = $i - 1; $j >= 0; $j--) {
            // 前面的數(shù)比臨時(shí)數(shù)大,則交換位置
            if ($arr[$j] > $tmp) {
                $arr[$j + 1] = $arr[$j];
                $arr[$j] = $tmp;
            }
        }
    }
    return $arr;
}
快速排序法
快速排序法是對(duì)冒泡排序的一種改進(jìn)。他的基本原理是:通過一趟排序?qū)⒋庞涗浄指畛瑟?dú)立的兩部分,其中一部分的關(guān)鍵字均比另一部分記錄的關(guān)鍵字小,則可分別對(duì)這兩部分記錄繼續(xù)進(jìn)行快速排序,整個(gè)排序過程可以遞歸進(jìn)行,以達(dá)到整個(gè)序列有序的目的。

快速排序法是從數(shù)列中挑出第一個(gè)數(shù)(最后一個(gè)數(shù))作為基準(zhǔn)元素,然后循環(huán)所有數(shù),和基準(zhǔn)書比較分為左右兩列,然后重復(fù)這樣的步驟繼續(xù)劃分為左右兩列,算法如下:

/**
 * 快速排序法
 * @param array $arr
 * @return array
 */
function quick_sort($arr) {
    // 判斷參數(shù)是否為數(shù)組,且不為空
    if (!is_array($arr) || empty($arr)) {
        return $arr;
    }
    // 數(shù)組長度為1停止排序
    $len = count($arr);
    if ($len == 1) {
        return $arr;
    }
    // 聲明左右兩個(gè)空數(shù)組
    $left = $right = [];
    // 循環(huán)遍歷,把第一個(gè)元素當(dāng)做基準(zhǔn)數(shù)
    for ($i = 1; $i < $len; $i++) {
        // 比較當(dāng)前數(shù)的大小,并放入對(duì)應(yīng)的左右數(shù)組
        if ($arr[$i] > $arr[0]) {
            $right[] = $arr[$i];
        } else {
            $left[] = $arr[$i];
        }
    }
    // 遞歸比較
    $left = quick_sort($left);
    $right = quick_sort($right);
    // 左右兩列以及基準(zhǔn)數(shù)合并
    return array_merge($left, [$arr[0]], $right);
}
使用方法

聲明一個(gè)待排序的數(shù)組,然后調(diào)用對(duì)應(yīng)的排序方法即可得到返回的排序好的數(shù)組;說明一下,我這里的排序設(shè)計(jì)都是遞增的,如果需要遞減,需要修改一下排序算法的比較替換符就行。

// 待排序數(shù)組
$arr = [1, 4, 5, 9, 3, 8, 6];
// 調(diào)用排序方法
$sort_arr = bubble_sort($arr);
// 輸出打印
print_r($sort_arr);
分析算法

通常,對(duì)于一個(gè)給定的算法,我們要做兩項(xiàng)分析:第一是從數(shù)學(xué)上證明算法的正確性,這一步主要用到形式化證明的方法及相關(guān)推理模式,如循環(huán)不變式、數(shù)學(xué)歸納法等。而在證明算法是正確的基礎(chǔ)上,第二步就是分析算法的時(shí)間復(fù)雜度。算法的時(shí)間復(fù)雜度反映了程序執(zhí)行時(shí)間隨輸入規(guī)模增長而增長的量級(jí),在很大程度上能很好反映出算法的優(yōu)劣與否。還有我們通常說的:算法優(yōu)化無非就是以時(shí)間換空間,以空間換時(shí)間,一般這兩者是不可兼得。

結(jié)束語

實(shí)現(xiàn)一個(gè)程序,肯定是有多種算法的,大家有其他想說的,都可以留言和我交流,謝謝!如有問題,也歡迎指出,我會(huì)及時(shí)改正,謝謝!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/30894.html

相關(guān)文章

  • PHP面試總結(jié)

    摘要:而在面試過程中,也是經(jīng)常會(huì)遇到的,所以,無論是面試準(zhǔn)備還是日常開發(fā),我們都應(yīng)該關(guān)注這方面的東西。二分法的基本做法是確定要查找的區(qū)間。區(qū)間內(nèi)選取二分點(diǎn)。根據(jù)二分點(diǎn)的值,綜合左右區(qū)間情況以及求解的目的,舍去一半無用的區(qū)間。 showImg(https://images.pexels.com/photos/935977/pexels-photo-935977.jpeg); 前言 面試是你進(jìn)入...

    alin 評(píng)論0 收藏0
  • GIAC 2017全球互聯(lián)網(wǎng)架構(gòu)大會(huì)最新日程

    摘要:月日至日,高可用架構(gòu)和聯(lián)合主辦的全球互聯(lián)網(wǎng)架構(gòu)大會(huì)將于上海光大會(huì)展中心舉行。全球互聯(lián)網(wǎng)架構(gòu)大會(huì)是高可用架構(gòu)技術(shù)社區(qū)推廣的面向架構(gòu)師技術(shù)負(fù)責(zé)人及高端技術(shù)從業(yè)人員的技術(shù)架構(gòu)大會(huì)。本次大會(huì)共有大板塊方向,場技術(shù)專題,個(gè)互聯(lián)網(wǎng)架構(gòu)案例。 showImg(https://segmentfault.com/img/bVZ3Vh?w=600&h=375);12月22日至23日,高可用架構(gòu)和msup聯(lián)...

    617035918 評(píng)論0 收藏0
  • GIAC 2017全球互聯(lián)網(wǎng)架構(gòu)大會(huì)最新日程

    摘要:月日至日,高可用架構(gòu)和聯(lián)合主辦的全球互聯(lián)網(wǎng)架構(gòu)大會(huì)將于上海光大會(huì)展中心舉行。全球互聯(lián)網(wǎng)架構(gòu)大會(huì)是高可用架構(gòu)技術(shù)社區(qū)推廣的面向架構(gòu)師技術(shù)負(fù)責(zé)人及高端技術(shù)從業(yè)人員的技術(shù)架構(gòu)大會(huì)。本次大會(huì)共有大板塊方向,場技術(shù)專題,個(gè)互聯(lián)網(wǎng)架構(gòu)案例。 showImg(https://segmentfault.com/img/bVZ3Vh?w=600&h=375);12月22日至23日,高可用架構(gòu)和msup聯(lián)...

    Imfan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<