摘要:而在證明算法是正確的基礎(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
摘要:而在面試過程中,也是經(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)入...
摘要:月日至日,高可用架構(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)...
摘要:月日至日,高可用架構(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)...
閱讀 3444·2021-11-25 09:43
閱讀 3491·2021-11-19 09:40
閱讀 2496·2021-10-14 09:48
閱讀 1337·2021-09-09 11:39
閱讀 1956·2019-08-30 15:54
閱讀 2848·2019-08-30 15:44
閱讀 2026·2019-08-29 13:12
閱讀 1570·2019-08-29 12:59