摘要:說明本文是對個人學習冒泡快速選擇和插入排序的小總結。不管咋樣,個人學習時有關索引就用到快速排序,索引也是以數據結構保存的存儲引擎,所以基本功還是很重要的嘛。
說明:本文是對個人學習冒泡、快速、選擇和插入排序的小總結。面試經常問這些東西,雖然不知道為啥老愛問這些,該問的又不問。不管咋樣,個人學習MySQL時有關索引就用到快速排序,索引也是以B+Tree數據結構保存的(Innodb存儲引擎),所以基本功還是很重要的嘛。
快速排序個人實驗發現,快速排序在這四個排序當中似乎是最快的,看下圖比較直觀:
看下代碼吧:
arrayQuickSort($left); $right = $this->arrayQuickSort($right); return array_merge($left, [$mid], $right); } } $arr = [5, 4, 5, 3, 8, 10, 3, 2, 4, 7]; $arr2 = array_rand(range(1, 1000), 500); shuffle($arr2); $quickSort = new QuickSort(); $time1 = microtime(true); //$quickArr = $quickSort->arrayQuickSort($arr); $quickArr = $quickSort->arrayQuickSort($arr2);//11.8780136108ms $time2 = microtime(true); //var_dump($quickArr); echo (($time2 - $time1)*1000)."ms".PHP_EOL;
實驗快速排序,排序隨機的500個數只要11ms左右,還挺快。
冒泡排序冒泡排序效率就比較差了,看圖比較直觀它的原理:
看代碼吧:
$data[$j+1]){ $this->swap($data[$j], $data[$j+1]); } } } return $data; } /** * 字符串排序也和數組一樣,字符串數組形式訪問字符 * @param string|string $str * @return string */ public function stringBubbleSort(string $str) { $count = strlen($str); for($i=0; $i<$count; $i++){ for($j=0; $j<$count-1-$i; $j++){ if($str[$j] > $str[$j+1]){ $this->swap($str[$j], $str[$j+1]); } } } return $str; } /** * 交換變量值 * @param $var1 * @param $var2 */ public function swap(&$var1, &$var2) { $tmp = $var1; $var1 = $var2; $var2 = $tmp; } } $arr = [5, 4, 5, 3, 8, 10, 3, 2, 4, 7]; $str = "SegmentFault"; $arr2 = array_rand(range(1, 1000), 500); shuffle($arr2); $sort = new BubbleSort(); $time1 = microtime(true); //$bubbleArr = $sort->arrayBubbleSort($arr); $bubbleArr = $sort->arrayBubbleSort($arr2);//316.018104553ms $time2 = microtime(true); //var_dump($bubbleArr); echo (($time2 - $time1)*1000)."ms".PHP_EOL;
實驗冒泡排序,排序隨機的500個數需要316ms左右,慢的不行。
插入排序插入排序個人覺得就像是玩撲克,牌桌上n張牌,一張張抓過來,然后新牌根據手上的m張牌依次比較,找到對應位置。看圖比較直觀:
看代碼吧:
0; $j--){ if($data[$j] > $data[$j-1]){ break; } $this->swap($data[$j-1], $data[$j]); } } return $data; } /** * 交換變量值 * @param $var1 * @param $var2 */ public function swap(&$var1, &$var2) { $tmp = $var1; $var1 = $var2; $var2 = $tmp; } } $arr = [5, 4, 5, 3, 8, 10, 3, 2, 4, 7]; $arr2 = array_rand(range(1, 1000), 500); shuffle($arr2); $insert = new InsertSort(); $time1 = microtime(true); //$insertArr = $insert->arrayInsertSort($arr); $insertArr = $insert->arrayInsertSort($arr2);//315.321922302ms $time2 = microtime(true); //var_dump($insertArr); echo (($time2 - $time1)*1000)."ms".PHP_EOL; include __DIR__ . "/autoload.php"; function inverst_sort(string $str): string { for ($i = 1; $i < strlen($str); $i++) { $key = $str[$i]; $j = $i - 1; while ($j > 0 && $str[$j] > $key) { $str[$j+1] = $str[$j]; $j = $j -1; } $str[$j+1] = $key; } return $str; } dump(inverst_sort("abdghhjc"));
實驗插入排序,排序隨機的500個數需要315ms左右,和冒泡排序差不多速度。
選擇排序選擇排序速度還行,看圖:
看代碼吧:
$data[$j]){ $min = $j; } } if($min != $i){ $this->swap($data[$min], $data[$i]); } } return $data; } /** * 交換變量值 * @param $var1 * @param $var2 */ public function swap(&$var1, &$var2) { $tmp = $var1; $var1 = $var2; $var2 = $tmp; } } $arr2 = array_rand(range(1, 1000), 500); shuffle($arr2); $arr = [5, 4, 5, 3, 8, 10, 3, 2, 4, 7]; $select = new SelectSort(); $time1 = microtime(true); //$selectArr = $select->arraySelectSort($arr); $selectArr = $select->arraySelectSort($arr2);//44.0230369568ms $time2 = microtime(true); //var_dump($selectArr); echo (($time2 - $time1)*1000)."ms".PHP_EOL;
實驗選擇排序,排序隨機的500個數需要44ms左右,速度還行。
總結:排序和查找是永恒主題。扎實下基本功,會繼續學習相關排序和查找算法,到時見。
歡迎關注Laravel-China。
RightCapital招聘Laravel DevOps
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21701.html
摘要:雖然有了十全的計劃,但如何高效率去記住上面那么多東西是一個大問題,看看我是怎么做的。 前言 前一篇文章講述了我在三月份毫無準備就去面試的后果,一開始心態真的爆炸,但是又不服氣,一想到每次回來后家人朋友問我面試結果的期待臉,越覺得必須付出的行動來證明自己了。 面經傳送門:一個1年工作經驗的PHP程序員是如何被面試官虐的? 下面是我花費兩個星期做的準備,主要分三部分: 有計劃——計劃好...
摘要:通常需要在實際的計算機運行才知道具體的執行時間。算法的執行時間往往和算法代碼中語句執行的數量有關。空間復雜度運行一段程序的內存占用,空間復雜度通常指的是算法程序在計算機只想中只想所需要的存儲空間。 基本數據結構 JS 數據類型 基本類型(棧 stack): Number String Boolean Null Undefined 和 Symbol(es6 新增)引用類型(堆 heap)...
摘要:本文記錄了我在學習前端上的筆記,方便以后的復習和鞏固。冒泡排序算法步驟比較相鄰的元素。這步做完后,最后的元素會是最大的數。重復第二步,直到所有元素均排序完畢。得到序列第二趟,,和進行交換。 本文記錄了我在學習前端上的筆記,方便以后的復習和鞏固。推薦大家去看看這一本gitBook上的書十大經典排序算法本文就是看這本書記錄的筆記。 冒泡排序 1.算法步驟 1.比較相鄰的元素。如果第一個比第...
閱讀 4309·2021-10-13 09:39
閱讀 485·2021-09-06 15:02
閱讀 3232·2019-08-30 15:53
閱讀 1043·2019-08-30 13:04
閱讀 2046·2019-08-30 11:27
閱讀 2017·2019-08-26 13:51
閱讀 2100·2019-08-26 11:33
閱讀 2907·2019-08-26 10:36